kal*_*kal 14 c c++ endianness
我想sizeof(int)
从char*
数组中读取字节.
a)在什么情况下我们需要担心是否需要检查字节序?
b)如何考虑或不考虑字节顺序,您将如何读取前4个字节.
编辑:sizeof(int)
我读取的字节需要与整数值进行比较.
解决这个问题的最佳方法是什么?
Dan*_*eer 19
你的意思是这样的吗?:
char* a;
int i;
memcpy(&i, a, sizeof(i));
Run Code Online (Sandbox Code Playgroud)
如果数据源来自不同的平台(如设备),则只需担心字节序.
Mat*_*vis 10
a)如果数据是在big-endian机器上创建的,并且正在小端机器上处理,反之亦然,你只需要担心"字节序"(即字节交换).有很多方法可以实现,但这里有几个例子.
在任何一种情况下,您都需要对大于1个字节的所有数字进行字节交换,例如,short,int,long,double等.但是,如果您始终处理来自同一平台的数据,则问题无关紧要.
b)根据你的问题,听起来你有一个char指针,想要将前4个字节作为int提取,然后处理任何endian问题.要进行提取,请使用:
int n = *(reinterpret_cast<int *>(myArray)); // where myArray is your data
Run Code Online (Sandbox Code Playgroud)
显然,这假设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));
}
Run Code Online (Sandbox Code Playgroud)
您不需要担心字节顺序,除非您正在从不同机器上创建的源(例如网络流)读取字节。
鉴于此,你不能只使用 for 循环吗?
void ReadBytes(char * stream) {
for (int i = 0; i < sizeof(int); i++) {
char foo = stream[i];
}
}
}
Run Code Online (Sandbox Code Playgroud)
您是否要求比这更复杂的东西?