在C里获得当前工作目录

三月 23, 2007 @ 11:29 下午 | 发表在 C/C++, Linux | 留下评论

因为大部分时间都是在用Java,C++只是偶尔用到,所以每次转过来的时候,总是要在一些最基本的函数上面挣扎一阵,唉,为什么就没有一个象JDK这样好用的文档可以查呢?

当前工作目录:getcwd

可执行程序被执行的绝对路径可以从argv[0]中获得.

执行文件popen

openssl – 使用EVP函数进行base64编码

三月 23, 2007 @ 12:23 上午 | 发表在 C/C++, 网络安全 | 留下评论

近日需要在C++下面做一些加解密的事情,因为是在Linux下面,首选自然是openssl. 但openssl的文档真是不敢恭维,文档少得可怜不说,在网络上搜索到的东西也是鱼龙混杂.我想我还是总结一下,有益于自己也造福别人.

首先是Base64的编码,openssl提供两种方式,BIO和EVP. BIO是老的方式,比较复杂,EVP则是新的方式,号称比较容易,但其实也不是那么直接.

一些网络上的文章号称使用EVP_EncodeBlock来处理Base64,但他们常常都忽略了一点,EVP_EncodeBlock的结果中没有换行符. openssl的命令行工具使用的是PEM的格式,也就是说,每隔64个字符,就会插入一个换行符.所以,使用EVP_EncodeBlock生成的结果和PEM是不兼容的.换句话说,这个结果使用openssl的命令行工具是读不出来的.这最开始让我非常困惑.

使用下面的代码可以生成正确的PEM编码.

使用openssl base64命令行工具可以确认结果.

/**
* Use EVP to Base64 encode the input byte array to readable text
*/
char* base64(const unsigned char *inputBuffer, int inputLen)
{
EVP_ENCODE_CTX ctx;
int base64Len = (((inputLen+2)/3)*4) + 1; // Base64 text length
int pemLen = base64Len + base64Len/64; // PEM adds a newline every 64 bytes
char* base64 = new char[pemLen];
int result;
EVP_EncodeInit(&ctx);
EVP_EncodeUpdate(&ctx, (unsigned char *)base64, &result, (unsigned char *)inputBuffer, inputLen);
EVP_EncodeFinal(&ctx, (unsigned char *)&base64[result], &result);
return base64;
}


/**
* Use EVP to Base64 decode the input readable text to original bytes
*/
unsigned char* unbase64(char *input, int length, int* outLen)
{
EVP_ENCODE_CTX ctx;
int orgLen = (((length+2)/4)*3) + 1;
unsigned char* orgBuf = new unsigned char[orgLen];
int result, tmpLen;
EVP_DecodeInit(&ctx);
EVP_DecodeUpdate(&ctx, (unsigned char *)orgBuf, &result, (unsigned char *)input, length);
EVP_DecodeFinal(&ctx, (unsigned char *)&orgBuf[result], &tmpLen);
result += tmpLen;
*outLen = result;
return orgBuf;
}

C++ Makefile 模版

三月 16, 2007 @ 5:26 上午 | 发表在 C/C++ | 留下评论

偶尔需要做些C++的项目,第一件事情就是写Makefile.其实我需要的Makefile都是大同小异.但每次都要花些时间重新写一个.终于决定把模板记下来.
目录结构:
[项目根目录]

| — inc
| — src
| — bin

头文件位于inc, .cpp位于src,生成的可执行文件位于bin. 这个Makefile也是位于src下面.

每添加一个新文件的时候,只需要在OBJS里面加上对应的项就可以.

# Compiler options
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)# Project layout
INC_DIR = ../inc
BIN_DIR = ../bin
EXE = licenseAgent
OBJS = LicenseAgent.o License.o Log.o
INCLUDES = -I $(INC_DIR)

all:$(EXE)

$(EXE): $(OBJS)
\mkdir -p $(BIN_DIR)
$(CC) $(LFLAGS) -o $(BIN_DIR)/$(EXE) $(OBJS)

clean:
\rm $(BIN_DIR)/$(EXE) $(OBJS)

%.o: %.C
$(CC) $(CFLAGS) $(INCLUDES) -c $<

在WordPress.com的博客.
Entries评论 feeds.