据我了解,字节顺序是指组成多字节字的字节的顺序不同,至少在最典型的情况下是这样。这样一个 16 位整数可以存储为 0xHHLL
或 0xLLHH
。
假设我没有错,我想知道的是,在 Endian 可能不同也可能不同的两台计算机之间发送信息时,Endianness 何时成为主要因素。
如果我以 char 数组的形式传输一个短整数 1,并且没有更正,它是否被接收并解释为 256?
如果我使用以下代码分解和重组短整数,字节序是否不再是一个因素?
// Sender: for(n=0, n < sizeof(uint16)*8; ++n) { stl_bitset[n] = (value >> n) & 1; }; // Receiver: for(n=0, n < sizeof(uint16)*8; ++n) { value |= uint16(stl_bitset[n] & 1) << n; };
- 是否有补偿字节顺序的标准方法?
提前致谢!
最佳答案
非常抽象地说,字节序是一个将变量重新解释为字符数组的属性。
实际上,当您 read()
从和 write()
到外部字节流(如文件或套接字)。或者,再次抽象地说,当您序列化数据时,字节序很重要(本质上是因为序列化的数据没有类型系统并且仅由哑字节组成);并且字节序在您的编程语言中 并不重要,因为该语言只对值 起作用,而不是表示。从一个到另一个是您需要深入研究细节的地方。
机智 - 写作:
uint32_t n = get_number();
unsigned char bytesLE[4] = { n, n >> 8, n >> 16, n >> 24 }; // little-endian order
unsigned char bytesBE[4] = { n >> 24, n >> 16, n >> 8, n }; // big-endian order
write(bytes..., 4);
在这里我们可以说,reinterpret_cast<unsigned char *>(&n)
,结果将取决于系统的字节序。
阅读:
unsigned char buf[4] = read_data();
uint32_t n_LE = buf[0] + buf[1] << 8 + buf[2] << 16 + buf[3] << 24; // little-endian
uint32_t n_BE = buf[3] + buf[2] << 8 + buf[1] << 16 + buf[0] << 24; // big-endian
再一次,我们可以说,uint32_t n = *reinterpret_cast<uint32_t*>(buf)
,结果将取决于机器字节序。
如您所见,如果您使用代数输入和输出操作,那么对于整数类型,您不必知道自己系统的字节序,而只需知道数据流的字节序。使用其他数据类型,例如 double
,问题就比较复杂了。
关于c++ - 字节顺序何时成为一个因素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179907/