【问题标题】:How to test endianness in node.js如何在 node.js 中测试字节顺序
【发布时间】:2012-05-06 04:55:03
【问题描述】:

当您读取一大块字节并需要将它们转换为数字时,node.js 具有 buffer.readInt32BE()buffer.readInt32LE() 之类的功能。

如果我只知道一个文件的前4个字节是一个整数,如果我不知道系统的字节序,我应该使用什么函数?大端还是小端?

进行快速谷歌搜索 (stackoverflow),在 C 中我们可以测试字节顺序:

if ( htonl(47) == 47 ) {
  // Big endian
} else {
  // Little endian.
}

我们如何测试 node.js 中的字节顺序以正确使用 readInt32BE 和 readInt32Le?

【问题讨论】:

  • 您基于什么假设您正在读取的文件是由同一台计算机编写的?您不应该担心知道编写文件的计算机的字节顺序吗?如果你必须从文件中读取,需要担心字节顺序并且文件不包含元数据,那么文件格式是错误的。
  • @Romain - 如果您在 unix-dgram 或 unix 域套接字上侦听 IPC 消息怎么办?我可以合理地期望字节序是相同的(除非作者的字节序被明确记录)。
  • @jimbobmcgee 如果它是一个套接字并且协议是严格的(例如指定字节序),那么您就知道字节序,并且处于相同的情况,就好像您的文件格式具有一些 BOM种类。如果不是,则依赖源以特定方式发出东西是一个糟糕的决定,除非您还拥有源代码(再说一遍,为什么要担心检查?)

标签: node.js endianness


【解决方案1】:

os.endianness() 返回 CPU 的字节顺序。可能的值为“BE”或“LE”。

它是在 Node.js v0.10.0 中添加的,它不包含在

来源:http://nodejs.org/api/os.html#os_os_endianness

【讨论】:

    【解决方案2】:

    如果您使用类型化数组,这完全有可能,甚至是合理的做法。我写了一个快速模块来检查你的系统是否是 node.js 上的小端:

    https://npmjs.org/package/is-little-endian

    【讨论】:

      【解决方案3】:

      您不需要测试主机系统的字节顺序。

      您需要调查缓冲区是使用哪种字节顺序格式化的,并使用正确的变体再次读取它。

      【讨论】:

      • 换句话说,你只需要知道。数据就是数据。你如何解释这一切都取决于你
      • 好的,但是如果想编写一个带有像readInt() 这样的公共函数的包,我不知道字节是如何排序的。那么我应该假设像 Java DataInputStream 这样的大字节序吗?
      • 很多时候,您只想对仅在本地使用的二进制数据使用本机字节序。我在用 Perl 和 C 编写的代码中有这种需求——那些语言没有告诉我“不要”——现在我只想将我的代码移植到 node.js
      • 我的回答与有关节点缓冲区方法的问题有关,并且成立。至于实际测试,请查看其他答案。
      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 2012-02-17
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2021-05-25
      相关资源
      最近更新 更多