我想sizeof(int)
从char*
数组中读取字节.
a)在什么情况下我们需要担心是否需要检查字节序?
b)如何考虑或不考虑字节顺序,您将如何读取前4个字节.
编辑:sizeof(int)
我读取的字节需要与整数值进行比较.
解决这个问题的最佳方法是什么?
你的意思是这样的吗?:
char* a; int i; memcpy(&i, a, sizeof(i));
如果数据源来自不同的平台(如设备),则只需担心字节序.
a)如果数据是在big-endian机器上创建的,并且正在小端机器上处理,反之亦然,你只需要担心"字节序"(即字节交换).有很多方法可以实现,但这里有几个例子.
您通过套接字在Windows计算机上接收数据.Windows采用little-endian架构,而网络数据"应该"采用big-endian格式.
您处理在具有不同"字节顺序"的系统上创建的数据文件.
在任何一种情况下,您都需要对大于1个字节的所有数字进行字节交换,例如,short,int,long,double等.但是,如果您始终处理来自同一平台的数据,则问题无关紧要.
b)根据你的问题,听起来你有一个char指针,想要将前4个字节作为int提取,然后处理任何endian问题.要进行提取,请使用:
int n = *(reinterpret_cast(myArray)); // where myArray is your data
显然,这假设myArray不是空指针; 否则,这会崩溃,因为它取消引用指针,所以采用一个良好的防御性编程方案.
要在Windows上交换字节,可以使用winsock2.h中定义的ntohs()/ ntohl()和/或htons()/ htonl()函数.或者您可以编写一些简单的例程来在C++中执行此操作,例如:
inline unsigned short swap_16bit(unsigned short us) { return (unsigned short)(((us & 0xFF00) >> 8) | ((us & 0x00FF) << 8)); } inline unsigned long swap_32bit(unsigned long ul) { return (unsigned long)(((ul & 0xFF000000) >> 24) | ((ul & 0x00FF0000) >> 8) | ((ul & 0x0000FF00) << 8) | ((ul & 0x000000FF) << 24)); }