Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从大端与小端数据提取数据_C++_Endianness - Fatal编程技术网

C++ 从大端与小端数据提取数据

C++ 从大端与小端数据提取数据,c++,endianness,C++,Endianness,假设我有一个函数,它应该能够从任何其他整数类型中提取任何整数类型(char,int,long,等等),因为一些数据输出设备喜欢将小数据打包成更大的数据类型(即uint32中的4chars)。我写了一个函数 获取一个数据数组 获取对向量的引用 接受一个表示结束的布尔值 这个函数片段有意义吗?我越想越失去信心 if(data_type_size == SIZE_OF_UINT32){ uint32_t d = 0; if(vector_type_size == SIZE_OF_CHA

假设我有一个函数,它应该能够从任何其他整数类型中提取任何整数类型(
char
int
long
,等等),因为一些数据输出设备喜欢将小数据打包成更大的数据类型(即
uint32
中的4
chars
)。我写了一个函数

  • 获取一个数据数组
  • 获取对向量的引用
  • 接受一个表示结束的布尔值
  • 这个函数片段有意义吗?我越想越失去信心

    if(data_type_size == SIZE_OF_UINT32){
        uint32_t d = 0;
        if(vector_type_size == SIZE_OF_CHAR){
            for(size_t i = 0; i < length; i++){
                d = data[i];
                if(big_endian){
                    v.push_back((d & 0xFF000000) >> 24);
                    v.push_back((d & 0x00FF0000) >> 16);
                    v.push_back((d & 0x0000FF00) >> 8);
                    v.push_back((d & 0x000000FF));
                }
                // little endian
                else {
                    v.push_back((d & 0x000000FF));
                    v.push_back((d & 0x0000FF00) >> 8);
                    v.push_back((d & 0x00FF0000) >> 16);
                    v.push_back((d & 0xFF000000) >> 24);
                }
            }
        }
    }
    
    上述代码输出

    0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11
    0xd,0xc,0xb,0xa,0x11,0x10,0xf,0xe
    

    这正是我所期望的。我想我开始患妄想症的地方是在想。。好。。
    4F
    实际上是
    F4
    的小端吗?但我不这么认为,因为这是字节的东西,而不是半字节(?)的东西。

    “实际上是
    4F
    F4
    的小尾端吗?”-不。“但我不这么认为,因为这是字节的东西,不是半字节(?)的东西”-正确。您的代码看起来不错。另一种方法是简单地将所有内容转换为网络字节顺序(big-endian)并提取信息,完成后转换为主机字节顺序。看见你这样做也很好——我只是作为另一种选择提到。@DavidC.Rankin,但那会更昂贵,不是吗?这些操作每秒会发生1000次。是的,我之所以提到它,是因为它是处理端点差异的标准方法。否则,您可以通过检查整数
    1
    的字节来确定endianness,或者按照您喜欢的方式来确定endianness。它将所有的endianess处理留给已建立的代码。
    0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11
    0xd,0xc,0xb,0xa,0x11,0x10,0xf,0xe