如何在c++中将字符串转换为字节数组

How to convert a string into a byte array in C++

本文关键字:转换 字节 字节数 数组 字符串 c++      更新时间:2023-10-16

我正在尝试将长度128字节的字符串转换为字节数组。例如:如果我的字符串是"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 failedn");
    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 %cn",i,newSign[i],i+1,newSign[i+1]);
    printf("bsign[%d] is %xn",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 %xn",n,bSign[n]);
        }

代码:

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]));