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)
我想将 转换buf为Header. 现在我正在使用该功能
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)
在此,在第一个值Header,head->type是适当的休息是垃圾。是否可以转换unsigned char* buf为Header?
唯一完全便携和安全的方式是:
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)
有关解释,请参阅将字节数组转换为整数
编辑
上一个链接的快速总结:根据不同系统的字节序,其他可能的解决方案(memcpy或union例如)是不可移植的(你所做的可能是为了在至少两个异构系统之间进行某种通信)=> 一些系统字节 [0 ] 是 int 的 LSB,byte[1] 是 MSB,其他是相反的。
此外,由于对齐,struct Header可能大于 5 个字节(在您的情况下可能是 6 个字节,如果对齐是 2 个字节!)(例如,请参见此处)
最后,根据某些平台的对齐限制和别名规则,编译器可能会生成不正确的代码。