在C中从十六进制字符串转换为字节数组

时间:2014-04-14 21:54:57

标签: c hex bytearray

我在TCP套接字服务器和放大器之间发送字节数组。 C中的客户端。我发送的信息是一系列整数。

我有它工作,但因为我不太熟悉C,我想知道是否有人可以建议一个更好的解决方案,或者至少看看并告诉我,我不是太疯狂或使用过时的代码我在做什么

首先,我生成一个随机十进制值,假设为“350”。我需要通过套接字连接作为十六进制字节数组传输。它在另一端被解码回其十进制值。

到目前为止,我用这种方式将其转换为hex:

unsigned char hexstr[4];
sprintf(hexstr, "%02X", numToConvert);  \\ where numToConvert is a decimal integer value like 350

此时,我在hexstr中有一个字符串,类似于“15E”(再次,使用十六进制值350作为示例)。

现在,我需要将它存储在一个字节数组中,使其看起来像:myArray = {0X00,0X00,0X01,0X5E};

显然我不能写:myArray = {0X00,0X00,0X01,0X5E},因为每次都会有不同的值,因为每次都会产生一个新的随机数。

目前,我这样做(伪代码因为字符串操作部分不相关但很长):

lastTwoChars = getLastTwoCharsFromString(hexstr); // so lastTwoChars would now contain "5E"

然后(实际代码):

sscanf(lastTwoChars, "%0X", &res); // now the variable res contains the byte representation of lastTwoChars, is my understanding

最后:

myArray[3] = res;

然后,我从hexstr中取下两个最右边的字符(再次,使用“15E”的样本值,这将是“01” - 如果只有1个字符,在这种情况下“1”是从“15E”中取出“5E”之后只剩下一个字符,我在左侧添加0来填充)并使用sscanf以相同方式转换,然后插入myArray [2]。重复myArray [1]和myArray [0]。

然后我使用write()发送数组。

所以,经过几个小时的封锁后,这一切都有效......但由于我不太使用C,我有一种唠叨的怀疑,这就是我所缺少的东西。任何人都可以发表评论,如果我正在做的事似乎没问题,或者有什么显而易见的我使用不当或忽视使用?

3 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <limits.h>

int main(){
    unsigned num = 0x15E;//num=350
    int i, size = sizeof(unsigned);
    unsigned char myArray[size];
    for(i=size-1;i>=0;--i, num>>=CHAR_BIT){
        myArray[i] = num & 0xFF;
    }
    for(i=0;i<size;++i){
        printf("0X%02hhX ", myArray[i]);//0X02X
    }
    printf("\n");
    return 0;
}

答案 1 :(得分:1)

在发送端,使用此代码将32位数转换为四字节数组

void ConvertValueToArray( uint32_t value, uint8_t array[] )
{
    int i;

    for ( i = 3; i >= 0; i-- )
    {
        array[i] = value & 0xff;
        value >>= 8;
    }
}

在接收端,使用此代码将字节数组转换回数字

uint32_t ConvertArrayToValue( uint8_t array[] )
{
    int i;
    uint32_t value = 0;

    for ( i = 0; i < 4; i++ )
    {
        value <<= 8;
        value |= array[i];
    }

    return( value );
}

请注意,在编写此类代码时使用int等通用类型非常重要 ,因为int在不同系统上的大小可能不同。固定大小的类型在<stdint.h>中定义。

这是一个简单的测试,用于演示转换(不通过网络实际发送字节数组)。

#include <stdio.h>
#include <stdint.h>

int main( void )
{
    uint32_t input, output;
    uint8_t byte_array[4];

    input = 350;
    ConvertValueToArray( input, byte_array );

    output = ConvertArrayToValue( byte_array );
    printf( "%u\n", output );
}

答案 2 :(得分:0)

如果您的阵列是4字节对齐的(即使它不支持未对齐访问的机器上),您也可以使用htonl函数将32位整数从主机转换为网络字节顺序并立即存储整个事物:

#include <arpa/inet.h> // or <netinet/in.h>

...

    *(uint32_t*)myArray = htonl(num);