字节数组的字节交换为long long

时间:2010-01-13 23:39:15

标签: c++

我有一个程序,我只需将一个字节数组复制到一个long long数组中。总共有20个字节,因此我只需要很长的3个字节。我将字节复制到长整数中的原因是为了使它在64位系统上可移植。

我只需要在填充该数组之前进行字节交换,以使进入它的值反转。

有一个byteswap.h,它有_int64 bswap_64(_int64)函数,我想我可以使用。鉴于我的long long数组,我希望能帮助我使用该函数。我只是简单地传入long long的名称并将其读入另一个长长的数组? 我使用的是c ++而不是.net或c#

更新: 显然我仍然有些困惑。例如,使用160位十六进制字符串恰好填充的字节数组,然后必须以十进制形式输出,这让我想到如果我只是对一个长(4字节)数组进行简单赋值的情况担忧会结束。然后我发现这个代码可以在64位太阳箱上运行。然后我认为,因为从一个env到另一个env的数据大小只能改变一个简单的赋值不会削减它。这让我想到只需使用很长时间就可以使代码免受那个大小问题的影响。然而,然后我读到了关于endianess以及64位如何读取MSB与32位是LSB的内容。因此,获取我的数据并将其反转,以便将其存储在我的长期内,因为MSB是我想到的唯一解决方案。 ofc,有关4个额外字节的情况,在这种情况下无关紧要,我只需要取十进制输出并显示我选择的任意随机六位数。但是以编程方式,我想最好只使用4个字节的长度,而不是处理整个浪费的4字节问题。

3 个答案:

答案 0 :(得分:2)

在此问题和之前的问题之间,听起来有几个基本的混淆:

  1. 如果您的程序将在64位计算机上运行,​​听起来您应该在64位计算机上进行编译和单元测试。在32位计算机上运行单元测试可以让您确信程序在该环境中是正确的,但并不一定意味着代码在64位环境中是正确的。

  2. 您似乎对32位和64位架构如何与字节序相关而感到困惑。 32位机器并不总是小端机器,64位机器并不总是大端机器。它们是两个独立的概念,可以独立变化。

  3. 字节顺序仅适用于由多个字节组成的单个值;例如,整数305,419,896(0x12345678)需要4个字节来表示,或者UTF-16字符(通常)需要2个字节来表示。对于这些,存储顺序很重要,因为字节被解释为单个单元。听起来你正在使用的是一系列原始字节(如校验和或散列)。像这样的值,其中多个字节不在组中解释,不受处理器的字节顺序的影响。在您的情况下,将字节数组转换为long long *实际上创建潜在的字节序问题(在小端架构上,您的字节现在将以相反的顺序解释),而不是另一种方式。

  4. 除非程序的little-endian和big-endian版本实际上必须相互通信,否则Endianness也无关紧要。例如,如果little-endian程序在没有交换的情况下写入包含多字节整数的文件,并且big-endian程序将其读入,则big-endian程序可能会错误地解释数据。听起来你认为你的代码在小端平台上工作会突然在大端平台上破解,即使两者从不交换数据。如果两个版本不需要相互通信,通常不需要担心架构的字节序。

  5. 另一个混乱点(也许有点迂腐)。一个字节不存储“十六进制值”与“十进制值”,它存储一个整数。十进制和十六进制只是表示(打印)特定整数值的两种不同方式。无论如何,它都是计算机内存中的二进制文件,十六进制只是一个简单的转换,从二进制和十进制转换对我们的大脑很方便,因为我们有十个手指。

  6. 假设你要做的是将数组的每个字节的值打印为十进制,你可以这样做:

    unsigned char bytes[] = {0x12, 0x34, 0x56, 0x78};
    for (int i = 0; i < sizeof(bytes) / sizeof(unsigned char); ++i)
    {
      printf("%u ", (unsigned int)bytes[i]);
    }
    printf("\n");
    

    输出应该是这样的:

      

    18 52 86 120

答案 1 :(得分:1)

我想你应该看看:htonl()和家庭

http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

这个函数系列用于编码/解码整数,以便在具有不同大小/字节整数的机器之间进行传输。

答案 2 :(得分:0)

  1. 以最清晰,最简单的方式编写程序。您不应该做任何事情来使其“便携”。

  2. 完成字节交换以将一个endianness的数据转换为另一个{{3}}。 bswap_64用于解决不同的64位系统(如Power和X86-64)之间的不兼容问题。它不是用于操纵您的数据。

  3. 如果要在C ++中反转字节,请尝试在STL中搜索“反向”。您将找到std::reverse,这是一个函数,它将指针或迭代器作为20字节序列的第一个和最后一个字节并反转它。它位于<algorithm>标题中。