c++ - 字节顺序何时成为一个因素?

标签 c++ networking stl endianness

据我了解,字节顺序是指组成多字节字的字节的顺序不同,至少在最典型的情况下是这样。这样一个 16 位整数可以存储为 0xHHLL0xLLHH

假设我没有错,我想知道的是,在 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/

相关文章:

c++ - c++中使用unordered_map实现哈希表并处理冲突

c++ - 返回拷贝而不是 const 引用时我会破坏代码吗

c++ - 为什么我的 boost 光纤代码死锁

c++ - 初始化引用时避免按值复制

ios - WKWebView 的 HTTP 代理支持

linux - 测量同一 wifi 网络中其他用户的下载速度?

c++ - STL 列表迭代器的问题

c++ - 稀疏的BLAS不包括在BLAS中吗?

c++ - 需要一个散列函数来从 ipv6 16 字节地址和 TCP 2 字节端口号中创建 32 位值

php - C++:提高ifstream二进制文件读取速度