//二进制转字符串(outbuff存放转换结果,必须拥有inbuff的两倍空间以上) //成功返回true 暂时不会失败 bool BinToA(const void *inbuff, int inlen, void *outbuff) { //将一个字节拆成前后四位,并分别加上64转换成两个可见字符 assert(inbuff != NULL && inlen > 0 && outbuff != NULL); memcpy((char *) outbuff + inlen, (char *) inbuff, inlen); char *pInPos = (char *) outbuff + inlen; char *pOutPos = (char *)outbuff; for (int i = 0; i < inlen; ++i) { *pOutPos++ = ( (*pInPos >> 4) & 0x0f ) | 0x40; //前四字节加64(| 0x40) *pOutPos++ = ( (*pInPos++) & 0x0f ) | 0x40; } return true; } //字符串转二进制(outbuff存放转换结果,必须拥有inbuff的一半空间以上) inlen必须是2的位数(因为2个字节合成1个) bool BinFromA(const void *inbuff, int inlen, void *outbuff) { //取两个字节的低四位和低四位,合并成一个字节(先取出来的字节低四位做为合并后字节高四位 assert(inbuff != NULL && (inlen > 0 && (inlen % 2) == 0) && outbuff != NULL); char *pInPos = (char *)inbuff; char *pOutPos = (char *)outbuff; char ch; for (int i = 0; i < inlen; i += 2) { //注意,不能合并为 *pOutPos++ = (*pInPos++ & 0x0f) | (*pInPos++ & 0x0f); 因为没有顺序点 ch = (*pInPos++ & 0x0f) << 4; *pOutPos++ = ( ch ) | (*pInPos++ & 0x0f); } return true; }