我有一个套接字服务器侦听来自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
我显然得到了错误的答案。
答案 0 :(得分:2)
您应该使用pack
和unpack
方法执行此操作:
[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
阶段。