Ruby:为什么 unpack('Q') 给出的结果与手动转换的结果不同?
Ruby: Why does unpack('Q') give a different result than manual conversion?
我正在尝试编写一个函数,它将 .unpack('Q')
(解压到 uint64_t)而无需访问解压方法。
当我手动从字符串转换为二进制再转换为 uint64 时,得到的结果与 .unpack('Q')
:
不同
Integer('abcdefgh'.unpack('B*').first, 2) # => 7017280452245743464
'abcdefgh'.unpack('Q').first # => 7523094288207667809
我不明白这里发生了什么。
我也不明白为什么.unpack('Q')
的输出不管输入的大小都是固定的。如果我在 'abcdefgh' 之后添加一千个字符然后解压 ('Q') 它,我仍然只是得到 [7523094288207667809]
?
字节顺序很重要:
Integer('abcdefgh'.
each_char.
flat_map { |c| c.unpack('B*') }.
reverse.
join, 2)
#⇒ 7523094288207667809
'abcdefgh'.unpack('Q*').first
#⇒ 7523094288207667809
您的代码产生了错误的结果,因为在转换为二进制后,bytes should be reversed。
对于问题的最后一部分,.unpack('Q')
的输出没有随着输入字符串的延长而改变的原因是格式指定了单个 64 位值,因此第一个字符之后的任何字符8 被忽略。如果您指定 Q2
的格式和 16 个字符的字符串,您将解码 2 个值:
> 'abcdefghihjklmno'.unpack('Q2')
=> [7523094288207667809, 8029475498074204265]
你会再次发现添加额外的字符不会改变结果:
> 'abcdefghihjklmnofoofoo'.unpack('Q2')
=> [7523094288207667809, 8029475498074204265]
Q*
的格式将 return 与输入中 64 位的倍数一样多的值:
> 'abcdefghihjklmnopqrstuvw'.unpack('Q*')
=> [7523094288207667809, 8029475498074204265, 8608196880778817904]
> 'abcdefghihjklmnopqrstuvwxyz'.unpack('Q*')
=> [7523094288207667809, 8029475498074204265, 8608196880778817904]
我正在尝试编写一个函数,它将 .unpack('Q')
(解压到 uint64_t)而无需访问解压方法。
当我手动从字符串转换为二进制再转换为 uint64 时,得到的结果与 .unpack('Q')
:
Integer('abcdefgh'.unpack('B*').first, 2) # => 7017280452245743464
'abcdefgh'.unpack('Q').first # => 7523094288207667809
我不明白这里发生了什么。
我也不明白为什么.unpack('Q')
的输出不管输入的大小都是固定的。如果我在 'abcdefgh' 之后添加一千个字符然后解压 ('Q') 它,我仍然只是得到 [7523094288207667809]
?
字节顺序很重要:
Integer('abcdefgh'.
each_char.
flat_map { |c| c.unpack('B*') }.
reverse.
join, 2)
#⇒ 7523094288207667809
'abcdefgh'.unpack('Q*').first
#⇒ 7523094288207667809
您的代码产生了错误的结果,因为在转换为二进制后,bytes should be reversed。
对于问题的最后一部分,.unpack('Q')
的输出没有随着输入字符串的延长而改变的原因是格式指定了单个 64 位值,因此第一个字符之后的任何字符8 被忽略。如果您指定 Q2
的格式和 16 个字符的字符串,您将解码 2 个值:
> 'abcdefghihjklmno'.unpack('Q2')
=> [7523094288207667809, 8029475498074204265]
你会再次发现添加额外的字符不会改变结果:
> 'abcdefghihjklmnofoofoo'.unpack('Q2')
=> [7523094288207667809, 8029475498074204265]
Q*
的格式将 return 与输入中 64 位的倍数一样多的值:
> 'abcdefghihjklmnopqrstuvw'.unpack('Q*')
=> [7523094288207667809, 8029475498074204265, 8608196880778817904]
> 'abcdefghihjklmnopqrstuvwxyz'.unpack('Q*')
=> [7523094288207667809, 8029475498074204265, 8608196880778817904]