ruby:将二进制字符串表示为Bignum
我需要一个任意长度的二进制字符串的数字表示。这项看似琐碎的任务出乎意料地变得复杂起来。到目前为止,我能想到的最好的办法是ruby:将二进制字符串表示为Bignum,ruby,pack,bignum,unpack,Ruby,Pack,Bignum,Unpack,我需要一个任意长度的二进制字符串的数字表示。这项看似琐碎的任务出乎意料地变得复杂起来。到目前为止,我能想到的最好的办法是 string.unpack('H*')[0].to_i(16) 但此操作缺乏可逆性,因为unpack可能会在最高半字节中返回前导零: ['ABC'].pack('H*') == ['0ABC'].pack('H*') # false 现在我需要检查在从整数转换后是否有偶数个半字节,如果需要的话,用零填充,等等。这一切都很好,很清楚,但我真不敢相信这一定很复杂 更新示例:
string.unpack('H*')[0].to_i(16)
但此操作缺乏可逆性,因为unpack可能会在最高半字节中返回前导零:
['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]。到_i(16)。到_s(16)]。打包('H*')。强制_编码“二进制”==s
否则,很难想象带前导零的半字节是如何转换成字符串字节的,而字符串字节不同于相同的字符串字节,而是从不带零的十六进制半字节转换而来。不幸的是,我对Ruby一无所知,尽管我有一个想法,你可以检查一下 可能是.to_s(16)方法转换为具有不同默认编码的字符串,当您在.pack('H*)之后进行字符串比较时,这可能很重要? 也许这会起作用: [s.unpack('H*')[0]。到_i(16)。到_s(16)]。打包('H*')。强制_编码“二进制”==s
否则,很难想象带前导零的半字节如何转换为字符串字节,而字符串字节与相同的字符串字节不同,但却是从不带零的十六进制半字节转换而来。给出一个示例输入和预期输出。您的文章仅对您编写的代码描述不够。这有什么问题?string.to_i(16)?string.to_(16)转换十六进制数字字符串,而不是任意位字符串。请给出一个示例输入和预期输出。您的文章仅对您编写的代码描述不够。这有什么问题?string.to_i(16)?string.to_(16)转换十六进制数字字符串,而不是任意位字符串。