举例
将"0123456789abcdef"
转换为{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_STR_LEN 32
unsigned char Char2Hex(unsigned char c)
{
unsigned char r = c;
if ('0' <= c && '9' >= c)
{
r = c - '0';
}
else if ('A' <= c && 'Z' >= c)
{
r = c - 'A' + 10;
}
else if ('a' <= c && 'z' >= c)
{
r = c - 'a' + 10;
}
// printf("%#x\n", r);
return r;
}
void String2Hex(char *pInHexStr, int iInHexStrLen, unsigned char *pOutHexByteBuf, int *pOutHexByteBufLen)
{
typedef union
{
unsigned char byte;
struct
{
unsigned char x : 4;
unsigned char y : 4;
} s;
} STR2HEX_S;
int i, cnt = 0;
unsigned char cTmp;
STR2HEX_S stStr2Hex;
char cFlag = 0;
stStr2Hex.byte = 1;
cFlag = stStr2Hex.s.y;
printf("cFlag:%u, cFlag+1:%u\n", cFlag, cFlag + 1);
for (i = 0; i < iInHexStrLen; i += 2)
{
stStr2Hex.byte = 0;
stStr2Hex.s.y = (unsigned char)Char2Hex(pInHexStr[i + cFlag]);
stStr2Hex.s.x = (unsigned char)Char2Hex(pInHexStr[i + !cFlag]);
pOutHexByteBuf[cnt++] = stStr2Hex.byte;
}
*pOutHexByteBufLen = cnt;
}
int main(int argc, char **argv)
{
int i, iInLen, iOutLen;
char szHexStr[] = "0123456789aBcDeF";
unsigned char szHexByte[sizeof(szHexStr)] = {0};
iInLen = strlen(szHexStr);
String2Hex(szHexStr, iInLen, szHexByte, &iOutLen);
printf("iInLen:%d, iOutLen:%d \n", iInLen, iOutLen);
printf("[SRC] %s\n", szHexStr);
printf("[DST] {");
for (i = 0; i < iOutLen; i++)
{
printf("0x%02X,", szHexByte[i]);
}
printf("}\n");
return 0;
}
注:
- 字符串需要
2字符对齐
,否则会自动在末尾补0
后转为字节数据. “1234”
==>{0x12,0x34}
"12345"
==>{0x12,0x34,0x50}
; 等价于"123450"
==>{0x12,0x34,0x50}