gpt4 book ai didi

c++ - 将字节数组的字节交换为 long long

转载 作者:行者123 更新时间:2023-11-30 03:11:44 28 4
gpt4 key购买 nike

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

我现在只需要在填充该数组之前进行字节交换,这样进入它的值就会反转。

有一个 byteswap.h,它具有我认为可以使用的 _int64 bswap_64(_int64) 函数。鉴于我的 long long 数组,我希望在使用该函数方面得到一些帮助。我会只是简单地传入 long long 的名称并将其读出到另一个 long long 数组中吗?我使用的是 C++ 而不是 .net 或 C#

更新:显然有些问题我仍然感到困惑。例如,使用恰好填充了 160 位十六进制字符串然后必须以十进制形式输出的字节数组让我想到了如果我只是对一个长(4 字节)数组进行简单赋值的情况担心会结束。然后我发现这段代码可以在 64 位 sun box 上运行。然后我认为,由于从一个环境到另一个环境的数据大小可以改变,所以一个简单的分配不会削减它。这让我想到只使用 long long 来使代码不受大小问题的影响。但是,然后我阅读了字节序以及 64 位如何读取 MSB 与 32 位(即 LSB)的区别。因此,获取我的数据并将其反转,以便将其存储在我的 long 中,因为 MSB 是我想到的唯一解决方案。 ofc,有关于 4 个额外字节的情况,在这种情况下无关紧要,我只是采用十进制输出并显示我选择的任何随机六位数字。但是在编程上,我想最好只使用 4 字节长而不处理整个浪费的 4 字节问题。

最佳答案

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

  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 程序将其读入,则 big-endian 程序可能会误解数据。听起来您认为在小端平台上运行的代码会突然在大端平台上崩溃,即使两者从不交换数据。如果两个版本不需要相互通信,您通常不需要担心架构的字节序。

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

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

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

关于c++ - 将字节数组的字节交换为 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061154/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com