0

我有一个套接字服务器正在侦听来自 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 

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

4

1 回答 1

2

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

[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阶段。

于 2013-06-19T19:46:43.663 回答