blockchain - ruby - string to hex to ascii , pack(H*), unpack(H*)
访问量: 1069
梦回大学 计算机组成原理:
bit 最小单位, 0 , 1 组成 , 比特。
byte = 8 bit , 字节。 a , b, c 等是一个字节, 汉字是两个字节
例如,字母a , 在ascii 表中,对应十进制的 97, 16进制的61, 那么 0x61 转换成 二进制,就是 0110,0001
说到网速的时候,往往叫 Mb , 100 Mb (bit) , 是 12.5MB(bytes) , 所以我们对百兆宽带的下载体验是10兆
ascii : 就是下面的表了。
Ruby中的各种表达
https://www.webascender.com/blog/working-bits-bytes-ruby/
0x 是 16进制数, (hex) 例如 0x11 = 17
0b 是二进制数 (binary) , 例如 0b1100001 = 0x61 = 97
Ruby中的字符串的 \x, \n
https://ruby-doc.com/docs/ProgrammingRuby/html/language.html
我们可以看到ruby中 \x 开头的字符串:
"\xff\x00\x2a".unpack('CCC')
=> [255, 0, 42]
\x 开头表示这是一个 hex , 16进制数
\n 开头表示这是一个8进制数。
所以 \xff = 0xff ,
pack 与 unpack
unpack: 就是把某个字符串 依次分解成对应的数 ( 输入是字符串,输入是字符串)
pack: 把一个字符串所表达的X进制数,组合成一个数。 (输入是String, pack后就是一个 hex/binary)
char to ascii 互相转换:
https://stackoverflow.com/questions/22957688/convert-string-with-hex-ascii-codes-to-characters
"a".unpack "H*" # => ["61"]
irb(main):013:0> "\xff".unpack "C*" => [255] irb(main):014:0> "\xff".unpack "H*" => ["ff"] irb(main):015:0> "\xff".unpack "B*" => ["11111111"]
["61"].pack "H*" # => "a" pack的参数必须是一个 []
["0110"].pack "b*" # => \x06 // 这里 二进制的 0110 , 对应 16进制 0x06
如何把 “0x11"字符串 转换成 2进制:
参考:https://stackoverflow.com/questions/5977510/converting-a-hexadecimal-number-to-binary-in-ruby
“0x11" = 就是字符串"11" = "00010001"
1 = 0001 , 所以11 = 00010001
irb(main):003:0> temp_string = '11' => "11" irb(main):004:0> full_since_binary_string = temp_string.hex.to_s(2).rjust(temp_string.size * 4 , '0') => "00010001" irb(main):005:0> temp_string = 'ab' => "ab" irb(main):006:0> full_since_binary_string = temp_string.hex.to_s(2).rjust(temp_string.size * 4 , '0') => "10101011"
ruby 十进制 转换成 2进制(binary), 16进制(hex) 的字符串
irb(main):007:0> 7.to_s 2 => "111" irb(main):008:0> 255.to_s 2 => "11111111" irb(main):009:0> 255.to_s 16 => "ff"
参考:http://facweb.cs.depaul.edu/sjost/it212/documents/ascii-pr.htm
下面是ASCII的对应表: