由于
printf的转换一个巨大的二进制数组时很慢。下面是不使用printf的另一种方法:
#define BASE16VAL ("x0x1x2x3x4x5x6x7x8x9|||||||xAxBxCxDxExF")
#define BASE16_ENCODELO(b) (BASE16SYM[((uint8)(b)) >> 4])
#define BASE16_ENCODEHI(b) (BASE16SYM[((uint8)(b)) & 0xF])
#define BASE16_DECODELO(b) (BASE16VAL[Char_Upper(b) - '0'] << 4)
#define BASE16_DECODEHI(b) (BASE16VAL[Char_Upper(b) - '0']).
为十六进制字符串转换为字节数组,你会做到以下几点:
while (*Source != 0)
{
Target[0] = BASE16_DECODELO(Souce[0]);
Target[0] |= BASE16_DECODEHI(Souce[1]);
Target += 1;
Source += 2;
}
*Target = 0;
源是一个指向包含字符数组十六进制串。 Target是一个指向包含字节数组的char数组的指针。
字节数组转换为十六进制字符串你会于以下内容:
while (*Source != 0)
{
Target[0] = BASE16_ENCODELO(*Source);
Target[1] = BASE16_ENCODEHI(*Source);
Target += 2;
Source += 1;
}
目标是一个指向包含一个十六进制字符串字符数组。 源是指向包含字节数组的char数组的指针。
这里有几个缺少宏:
#define Char_IsLower(C) ((uint8)(C - 'a') < 26)
#define Char_IsUpper(C) ((uint8)(C - 'A') < 26)
#define Char_Upper(C) (Char_IsLower(C) ? (C + ('A' - 'a')) : C)
#define Char_Lower(C) (Char_IsUpper(C) ? (C + ('a' - 'A')) : C)
你所说的“二进制字节数组”是什么意思? C中的“String”只是一个包含值(字节)的内存块(数组),它被映射为ASCII字符。 – 2011-04-14 17:08:32
有些东西与Java中的字节数组相似。你还可以以字节数组的形式处理字符串。 – Maverickgugu 2011-04-14 17:10:47
您似乎对术语非常困惑。 C *中的字符串已经是一个二进制字节数组,或多或少的定义。它可能也已经是ASCII码(除非它是Unicode的其他编码,它支持U + 0000到U + 007F以外的字符)。所以请再次尝试解释你想要这个“bytearr”的内容。 – zwol 2011-04-14 17:11:27