带有位串的意外解压缩结果

Jus*_*tin 6 ruby unpack

为什么当我打开irb并且我跑步时
puts 'A'.unpack("B8")
我会得到01000001但是当我跑步时
puts 'A'.unpack("B4B4")
我只会得到0100而不是[0100,0001]

unpack的分辨率只是一个完整的字节?没什么?

toc*_*och 5

让我们做一些测试来理解行为:

> 'A'.unpack('B8')
 => ["01000001"] 
Run Code Online (Sandbox Code Playgroud)

它返回char的8个最高有效位(MSB) 'A'

> 'A'.unpack('B4')
 => ["0100"]
Run Code Online (Sandbox Code Playgroud)

它返回char的4个MSB 'A'

> 'A'.unpack('B16')
 => ["01000001"]
Run Code Online (Sandbox Code Playgroud)

它返回16个MSB的char 'A',但由于只有8个,我们得到8个MSB

> 'AB'.unpack('B16')
 => ["0100000101000010"]
Run Code Online (Sandbox Code Playgroud)

它返回字符序列的16个MSB 'AB'(结束8位01000010对应'B')

> 'AB'.unpack('B10')
 => ["0100000101"]
Run Code Online (Sandbox Code Playgroud)

它返回字符序列的10个MSB 'AB',即8个MSB 'A'和2个MSB'B'

> 'ABC'.unpack('B*')
 => ["010000010100001001000011"]
Run Code Online (Sandbox Code Playgroud)

它返回字符序列的所有MSB 'ABC',(结束8位01000011对应'C')

> 'AB'.unpack('B8B8')
 => ["01000001", "01000010"]
Run Code Online (Sandbox Code Playgroud)

它返回以下数组:

  • 第一个元素是char的8个MSB 'A'
  • 第二个元素是char的8个MSB 'B'

_

> 'AB'.unpack('B8B7')
 => ["01000001", "0100001"]
Run Code Online (Sandbox Code Playgroud)

它返回以下数组:

  • 第一个元素是char的8个MSB 'A'
  • 第二个元素是char的7个MSB 'B'

_

> 'AB'.unpack('B4B8')
 => ["0100", "01000010"]
Run Code Online (Sandbox Code Playgroud)

它返回以下数组:

  • 第一个元素是char的4个MSB 'A'
  • 第二个元素是char的8个MSB 'B'

_

> 'AB'.unpack('B16B8')
 => ["0100000101000010", ""]
Run Code Online (Sandbox Code Playgroud)

它返回以下数组:

  • 第一个元素是字符序列的16个MSB 'AB'
  • 第二个元素是空的,因为字符已被消耗

_

> 'AB'.unpack('B*B8')
 => ["0100000101000010", ""]
Run Code Online (Sandbox Code Playgroud)

它会为您提供相同的结果,并使用所有字符串.

> 'AB'.unpack('B9B8')
 => ["010000010", ""]
Run Code Online (Sandbox Code Playgroud)

它返回以下数组:

  • 第一个元素是字符序列的9个MSB 'AB'
  • 第二个元素是空的,因为字符已被消耗

作为结论,

BNString上的指令最多会占用String的第一个((N-1) / 8) + 1字符.如果字符串中仍有字符,并且您有第二个指令BM,则最多会消耗((M-1) / 8) + 1字符串的下一个字符.等等所有下一个指令.如果使用该指令B*,它将使用所有字符,并返回其相应MSB的序列.

例如:

'ABCDEFG'.unpack('B17B*B8')
Run Code Online (Sandbox Code Playgroud)

它应该让我们回报:

  • 序列的17个MSB ABC
  • 序列的所有MSB DEFG
  • 一个空的串串

让我们检查:

> 'ABCDEFG'.unpack('B17B*B8')
 => ["01000001010000100", "01000100010001010100011001000111", ""]
Run Code Online (Sandbox Code Playgroud)

并且确实在第一个指令消耗char时'A'.unpack('B4B4')返回数组.["0100", ""]A