[英]ruby: representing binary string as Bignum
我需要一个任意长度的二进制字符串的数字表示形式。 这个看似微不足道的任务出乎意料地变得复杂。 到目前为止,我能想到的最好的方法是
string.unpack('H*')[0].to_i(16)
但是此操作缺乏可逆性,因为解压缩可能会在最高半字节中返回前导零:
['ABC'].pack('H*') == ['0ABC'].pack('H*') # false
现在,我需要检查从整数转换后是否得到了半字节的偶数个数,如果需要,则填充零,等等。这一切都很好,但我简直不敢相信这一定会令人费解。
更新示例:
s = "\x01\x1D\x9A".force_encoding 'binary' # "\x01\x1D\x9A"
s.unpack('H*') # ["011d9a"]
s.unpack('H*')[0].to_i(16) # 73114
现在让我们解码:
s.unpack('H*')[0].to_i(16).to_s(16) # "11d9a" — notice that leading zero is gone
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') # "\x11\xD9\xA0"
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') == s # false, obviously
换句话说,我们无法解码到与开始时相同的值。
不幸的是,尽管我有一个可以检查的想法,但我对Ruby的知识却为零。
可能是.to_s(16)方法转换为具有不同默认编码的字符串,在.pack('H *')之后进行字符串比较时,这可能很重要吗? 可能会这样:[s.unpack('H *')[0] .to_i(16).to_s(16)]。pack('H *')。force_encoding'binary'== s
否则,很难想象以零开头的半字节如何转换成与相同字符串字节不同但又从没有零的十六进制半字节转换成的字符串字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.