如何将字节转换为秒?

时间:2013-06-19 19:24:24

标签: ruby binary-data multibyte

我有一个套接字服务器侦听来自GSM设备的UDP数据包。一些数据以多字节形式出现,例如时间,这需要多字节的准确性。这是一个例子:

179,248,164,14

字节以十进制表示法表示。我的目标是将其转换为秒:

245692595

我正在尝试这样做并被告知:

  

“你必须把这4个字节放在一个小的endian格式的长整数中。如果你使用Python来读取和编码数据,你需要看一下使用.read()和struct。 unpack()方法成功将其转换为整数。结果值是自01/01/2000以来的秒数。“

所以,我试着这样做:

%w(179 248 164 14).sort.map(&:to_i).inject(&:+)
 => 605 

我显然得到了错误的答案。

1 个答案:

答案 0 :(得分:2)

您应该使用packunpack方法执行此操作:

[179,248,164,14].pack('C*').unpack('I')[0]
# => 245692595
但是,这并不是要将它们加在一起。你做的数学错了。使用inject执行此操作的正确方法是:

 [179,248,164,14].reverse.inject { |s,v| s * 256 + v }
 # => 245692595

请注意,在表示长度超过一个字节的二进制数时,您必须考虑byte ordering

如果原始数据已经是二进制字符串,则不必执行pack操作,可以直接进入unpack阶段。