我有一个套接字服务器监听来自GSM设备的UDP数据包。有些数据是以多字节的形式输入的,比如时间,它需要多字节来保证准确性。下面是一个示例:
179,248,164,14
字节以十进制表示。我的目标是将其转换为秒:
245692595
我正试图这样做,却被告知:
"你必须把这4个字节放在一个小端序格式的长整数中。如果您正在使用Python读取和编码数据,则需要查看使用.read()和struct.unpack()方法来成功地将其转换为整数。结果值是自01/01/2000以来的秒数。"
所以,我试着这样做:
%w(179 248 164 14).sort.map(&:to_i).inject(&:+)
=> 605
显然我得到了错误的答案
您应该使用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
注意,当表示大于一个字节长的二进制数时,必须考虑字节顺序。
如果原始数据已经是二进制字符串,您将不必执行pack
操作,可以直接进入unpack
阶段。