我正在尝试将长度为128bytes的字符串转换为字节数组。例如:如果我的字符串是“76ab345fd77 ......”等等。我想将它转换为字节数组,因此它应该看起来像{76 ab 34 45 ....}等等,最多64字节。我写了下面的代码,但字节数组总是显示值为1而不是76 ab ....任何关于我在这里做错了什么的建议或者是否有更好的方法来实现这个:
char* newSign; // It contains "76ab345fd77...."
int len = strlen(newSign); //len is 128
int num = len/2;
PBYTE bSign;
//Allocate the signature buffer
bSign = (PBYTE)HeapAlloc (GetProcessHeap (), 0, num);
if(NULL == bSign)
{
wprintf(L"**** memory allocation failed\n");
return;
}
int i,n;
for(i=0,n=0; n<num ;i=i+2,n++)
{
bSign[n]=((newSign[i]<<4)||(newSign[i+1]));
printf("newsign[%d] is %c and newsign[%d] is %c\n",i,newSign[i],i+1,newSign[i+1]);
printf("bsign[%d] is %x\n",n,bSign[n]);
//sprintf(bSign,"%02x",()newSign[i]);
}
非常感谢所有的回复。以下代码对我有用:
BYTE ascii_to_num(char c)
{
if ('0' <= c && c <= '9')
return c - '0';
if ('a' <= c && c <= 'f')
return c -('a'-('0'+10));
}
for(i=0,n=0; n<num ;i=i+2,n++)
{
BYTE a = (ascii_to_num(newSign[i])) & 0x0F;
BYTE b = ascii_to_num(newSign[i+1]) & 0x0F;
bSign[n] = (a<<4) | (b);
printf("bsign[%d] is %x\n",n,bSign[n]);
}
答案 0 :(得分:2)
代码:
bSign[n]=((newSign[i]<<4)||(newSign[i+1]));
不会将十六进制字符转换为字节。另请注意,您需要按位或|而不是逻辑或||。对于十进制数字,它更像是
bSign[n]=(((newSign[i]-'0')<<4)|((newSign[i+1]-'0'));
但您还需要处理a-f值。为此,您需要编写一个函数来将十六进制字符转换为值
例如
int hexToVal(char c)
{
c = (c | 0x20) - '0';
if (c<0) error;
if (c>9) {
c -= ('a'-('0'+10));
if (c<10 || c>15) error;
}
return c;
}
bSign[n]=((hexToVal(newSign[i])<<4)|hexToVal(newSign[i+1]));