将字符缓冲区转换为结构

Akh*_*uku 2 c++ struct pointers type-conversion unsigned-char

我有一个包含, , , , ,的char缓冲区bufbuf[0] = 10buf[1] = 3buf[2] = 3buf[3] = 0buf[4] = 58

和一个结构:

typedef struct
{ 
    char type;
    int version;
    int length;
}Header;
Run Code Online (Sandbox Code Playgroud)

我想将 转换bufHeader. 现在我正在使用该功能

int getByte( unsigned char* buf)
{
    int number = buf[0]; 
    return number;
}

int getInt(unsigned char* buf)
{
    int number =  (buf[0]<<8)+buf[1];
    return number;
}

main()
{
    Header *head = new Header;
    int location = 0;

    head->type = getByte(&buf[location]);
    location++;     // location = 1

    head->version = getInt(&buf[location]);
    location += 2;  // location = 3

    head->ength = getInt(&buf[location]);
    location += 2;  // location = 5 
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找解决方案,例如

 Header *head = new Header;

 memcpy(head, buf, sizeof(head));
Run Code Online (Sandbox Code Playgroud)

在此,在第一个值Headerhead->type是适当的休息是垃圾。是否可以转换unsigned char* bufHeader?

Gar*_*365 5

唯一完全便携和安全的方式是:

void convertToHeader(unsigned char const * const buffer, Header *header)
{
    header->type = buffer[0];
    header->version = (buffer[1] <<  8) | buffer[2];
    header->length = (buffer[3] <<  8) | buffer[4];
}
Run Code Online (Sandbox Code Playgroud)

void convertFromHeader(Header const * const header, unsigned char * buffer)
{
    buffer[0] = header->type;
    buffer[1] = (static_cast<unsigned int>(header->version) >>  8) & 0xFF;
    buffer[2] = header->version & 0xFF;
    buffer[3] = (static_cast<unsigned int>(header->length) >>  8) & 0xFF;
    buffer[4] = header->length & 0xFF;
}
Run Code Online (Sandbox Code Playgroud)

例子

有关解释,请参阅将字节数组转换为整数

编辑

上一个链接的快速总结:根据不同系统的字节序,其他可能的解决方案(memcpyunion例如)是不可移植的(你所做的可能是为了在至少两个异构系统之间进行某种通信)=> 一些系统字节 [0 ] 是 int 的 LSB,byte[1] 是 MSB,其他是相反的。

此外,由于对齐,struct Header可能大于 5 个字节(在您的情况下可能是 6 个字节,如果对齐是 2 个字节!)(例如,请参见此处

最后,根据某些平台的对齐限制和别名规则,编译器可能会生成不正确的代码。