gpt4 book ai didi

ruby - 从二进制文件解析 Unix 时间戳

转载 作者:数据小太阳 更新时间:2023-10-29 08:36:36 24 4
gpt4 key购买 nike

我有一个字节数组 [83, 9, 39, 209] 代表 Unix 时间戳,从二进制文件解析。

如何将其转换为(32 位)整数?

我整夜都在为 #pack 和 #unpack 苦苦挣扎,但我被困在十六进制和字节值之间('N' 和 'L' 指令没有给我预期的结果)。我如何从中构造一个 int?

否则我应该以不同的方式解析文件(使用十六进制值)吗?谢谢!

最佳答案

一般规则是您使用 Array#pack将数据结构打包成字节序列以通过网络发送或将它们保存到磁盘,您可以使用 String#unpack将字节序列解压缩到内存中的数据结构中。您有一个包含四个字节的序列,您希望将其解压 为一个 32 位整数,因此您正在寻找 String#unpack

如果你有原始字节那么你可以说:

"\x53\x09\x27\xd1".unpack('N')

得到 [1393108945] 然后 Time.at(1393108945) 会给你 2014-02-22 14:42:25 -0800。该时间戳似乎正是您要查找的内容。

如果您已经受困于整数 数组,那么您可以使用以下方法手动完成:

a = [83, 9, 39, 209]
t = a.reverse # Reverse the "byte" order to match `with_index`
.map.with_index { |e, i| e * 2 ** (8 * i) } # Shift the bits into the right 32 bit integer positions
.inject(:+) # Add them up to get a single 32 bit integer

这将在 t 中留下 1393108945。您还可以展开 Enumerable 争论并手动完成:

a[0] * 2 ** (8 * 3) + a[1] * 2 ** (8 * 2) + a[2] * 2 ** 8 + a[3]

不过,所有运算符都使它看起来有点像线路噪声。

如果可以的话,使用原始字节和 String#unpack 可能会更好。

关于ruby - 从二进制文件解析 Unix 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388090/

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