Back

blockchain - ruby - string to hex to ascii , pack(H*), unpack(H*)

发布时间: 2022-01-17 03:30:00

梦回大学 计算机组成原理:

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的对应表:

Back