Ruby 如何将字节转换为秒?

Ruby 如何将字节转换为秒?,ruby,binary-data,multibyte,Ruby,Binary Data,Multibyte,我有一个套接字服务器监听来自GSM设备的UDP数据包。一些数据以多字节的形式输入,例如时间,这需要多字节才能保证准确性。这是一个例子: 179,248,164,14 字节以十进制表示。我的目标是将其转换为秒: 245692595 我正试图这样做,有人告诉我: 您必须将这4个字节放入一个小尾端格式的长整数中。如果您使用Python读取和编码数据,则需要考虑使用.read()和struct.unpack()方法将其成功转换为整数。结果值是自2000年1月1日起的秒数 所以,我试着这样做: %w(

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

179,248,164,14
字节以十进制表示。我的目标是将其转换为秒:

245692595
我正试图这样做,有人告诉我:

您必须将这4个字节放入一个小尾端格式的长整数中。如果您使用Python读取和编码数据,则需要考虑使用.read()和struct.unpack()方法将其成功转换为整数。结果值是自2000年1月1日起的秒数

所以,我试着这样做:

%w(179 248 164 14).sort.map(&:to_i).inject(&:+)
 => 605 
[179,248,164,14].pack('C*').unpack('I')[0]
# => 245692595

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

您应该使用
打包
解包
方法来执行此操作:

%w(179 248 164 14).sort.map(&:to_i).inject(&:+)
 => 605 
[179,248,164,14].pack('C*').unpack('I')[0]
# => 245692595
但这并不是把它们加在一起。你算错了。使用
inject
执行此操作的正确方法是:

 [179,248,164,14].reverse.inject { |s,v| s * 256 + v }
 # => 245692595
注意:当表示长度超过一个字节的二进制数时,必须考虑


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

+1表示
pack
/
unpack
。虽然
inject
方法可以工作,但我认为如果要分析很多值,速度会慢一些。您必须进行基准测试才能确定,但是
unpack
通常非常快。
pack('C*')
做什么?你为什么用它?@OMG 1.9.3p0:039>“h”。解包('C*')=>[104]1.9.3p0:040>“h”。解包('B*)=>[“011010000”]1.9.3p0:041>“011010000”。to_i(2)。to_s(10)=>“104”。它给出二进制的无符号整数值。@OMG
pack('C*')
用于将字节值列表(
C
代表“无符号字符”)组合成二进制字符串。