由于在转换大型二进制数组时,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;
源是一个指向包含十六进制字符串的字符数组的指针。
目标是一个指向将包含字节数组的字符数组的指针。
要将字节数组转换为十六进制字符串,您需要执行以下操作:
while (*Source != 0)
{
Target[0] = BASE16_ENCODELO(*Source);
Target[1] = BASE16_ENCODEHI(*Source);
Target += 2;
Source += 1;
}
目标是一个指向包含十六进制字符串的字符数组的指针。
源是一个指向将包含字节数组的字符数组的指针。
这里有一些缺失的宏:
#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)