Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby:将二进制字符串表示为Bignum_Ruby_Pack_Bignum_Unpack - Fatal编程技术网

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)转换十六进制数字字符串,而不是任意位字符串。