问题标签 [endianness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
12823 浏览

endianness - 字节序的类型

以下类型的字节序有什么区别?

  • 字节(8b)不变的大端和小端
  • 半字 (16b) 不变的大端和小端
  • word (32b) 不变的大端和小端
  • 双字 (64b) 不变的大端和小端

还有其他类型/变体吗?

0 投票
1 回答
2404 浏览

c# - 使用 C# 在 Little Endian 或 Big Endian 中写入/读取二进制数据的最佳方法?

好的,如果我在.NET 下有一个以小端或大端编码的二进制文件,那么读取/写入它的最佳方法是什么?

在 .NET 框架中,我只设法找到了默认使用小端序的 BinaryWritters / BinaryReaders,所以我的方法是实现我自己的 BinaryReader / BinaryWritter 用于以大端序读取/写入数据,但我想知道是否有更好的方法.

0 投票
7 回答
20979 浏览

macos - 新 Mac 的字节序 - 现在所有的 pc 平台都一样吗?

将 mac 换成 Intel 芯片是否意味着我们已经完成了在二进制资源中为跨平台数据分布处理数字的问题?

这是这个问题的最后一个还是我不知道的其他平台?

0 投票
34 回答
367462 浏览

c++ - 如何在 C++ 中的大端和小端值之间进行转换?

如何在 C++ 中的大端和小端值之间进行转换?

为清楚起见,我必须将二进制数据(双精度浮点值以及 32 位和 64 位整数)从一种 CPU 架构转换为另一种。这不涉及网络,因此 ntoh() 和类似的功能在这里不起作用。


注意:我接受的答案直接适用于我所针对的编译器(这就是我选择它的原因)。但是,这里还有其他非常好的、更便携的答案。

0 投票
2 回答
5215 浏览

c - 如何 BSWAP 64 位寄存器的低 32 位?

我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案。例如,0x0123456789abcdef在 RAX 寄存器中,我想0x01234567efcdab89用一条指令将其更改为(因为性能)。

所以我尝试了以下内联函数:

结果是0x00000000efcdab89。我不明白为什么编译器会这样。有人知道有效的解决方案吗?

0 投票
6 回答
4902 浏览

c++ - 如何以位字节序将数字转换为字节数组

我正在尝试使用 zlib API 解压缩在 VB6 中创建的一些数据。

我已经阅读了 qUncompress 函数可以做到这一点:http: //doc.trolltech.com/4.4/qbytearray.html#qUncompress

我已经通过 readRawBytes 将 QDataStream 中的数据读入一个 char 数组,然后我将其转换为 QByteArray 进行解压缩。我有压缩长度和预期的解压缩长度,但没有从 qUncompress 得到任何东西。

但是,我需要以大端格式添加预期的解压缩长度。有没有人这样做并有一个例子?

0 投票
5 回答
2941 浏览

c++ - 如何在 C++ 中获取 char 的整数值?

我想将存储在 32 位无符号整数中的值放入四个字符中,然后将每个字符的整数值存储在一个字符串中。

我认为第一部分是这样的:

0 投票
6 回答
105338 浏览

c# - C# 小端还是大端?

在允许我们通过 UDP/IP 控制它的硬件文档中,我发现了以下片段:

在该通信协议中,DWORD 为 4 字节数据,WORD 为 2 字节数据,BYTE 为单字节数据。存储格式为little endian,即4字节(32bits)数据存储为:d7-d0、d15-d8、d23-d16、d31-d24;双字节(16 位)数据存储为:d7-d0、d15-d8。

我想知道这如何转换为 C#?我必须在发送之前转换东西吗?例如,如果我想发送一个 32 位整数或 4 个字符的字符串?

0 投票
5 回答
3659 浏览

c - 在 C 中安全地把 char* 加倍

在我编写的开源程序中,我正在从文件中读取二进制数据(由另一个程序编写)并输出整数、双精度和其他各种数据类型。挑战之一是它需要在两种字节序的 32 位和 64 位机器上运行,这意味着我最终不得不做相当多的低级位旋转。我对类型双关语和严格别名了解(非常)一点,并希望确保我以正确的方式做事。

基本上,很容易从 char* 转换为各种大小的 int:

我有一组支持函数来根据需要交换字节顺序,例如:

在运行时,程序会检测机器的字节序并将上述之一分配给函数指针:

现在,当我尝试将 char* 转换为 double 时,棘手的部分就来了。我想像这样重新使用字节序交换代码:

然而,一些编译器可能会优化掉“int64todouble.i”赋值并破坏程序。有没有更安全的方法来做到这一点,同时考虑到这个程序必须保持性能优化,而且我不希望编写一组并行转换来直接将 char* 转换为 double ?如果双关语的联合方法是安全的,我是否应该重写我的函数,如 snativeint64_t 来使用它?


我最终使用了Steve Jessop 的答案,因为转换函数被重写为使用 memcpy,如下所示:

编译成与我的原始代码完全相同的汇编程序:

在这两者中,memcpy 版本更明确地表达了我正在尝试做的事情,并且应该适用于即使是最天真的编译器。

亚当,你的回答也很棒,我从中学到了很多。感谢您的发布!

0 投票
4 回答
8987 浏览

c++ - 有没有办法做一个 C++ 风格的编译时断言来确定机器的字节顺序?

我有一些模板化的低级序列化代码,我显然需要在编译时知道系统的字节序(因为模板专门基于系统的字节序)。

现在我有一个带有一些平台定义的标题,但我宁愿通过一些模板化测试(如 static_assert 或 boost_if)做出关于字节顺序的断言。原因是我的代码需要在各种机器、许多专业供应商的机器上编译和运行,并且可能在 2008 年不存在的设备上运行,所以我真的无法猜测到那个标题年份可能需要什么在路上。由于代码库的预期寿命约为 10 年。所以我不能永远遵循代码。

希望这能说明我的情况。

那么有没有人知道可以确定字节顺序的编译时测试,而不依赖于供应商特定的定义?