如何收拾()和解压()在Ruby中工作(How does pack() and unpack() w

2019-07-18 03:38发布

在Ruby为什么我们需要阵列Packing ? 如何directive帮助下做这样的包装吗?

我跑了一些代码在我的控制台,看看有什么和如何指令看起来像阵列packing.But输出与每个指令密切相同。 然后,在核心,他们有什么不同?

irb(main):003:0> n = [ 65, 66, 67 ]
=> [65, 66, 67]
irb(main):004:0> n.pack("ccc")
=> "ABC"
irb(main):005:0> n.pack("C")
=> "A"
irb(main):006:0> n.pack("CCC")
=> "ABC"
irb(main):007:0> n.pack("qqq")
=> "A\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\
x00\x00\x00"
irb(main):008:0> n.pack("QQQ")
=> "A\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\
x00\x00\x00"
irb(main):009:0> n.pack("SSS")
=> "A\x00B\x00C\x00"
irb(main):010:0> n.pack("sss")
=> "A\x00B\x00C\x00"
irb(main):011:0>

我现在可以从控制台中看到n.pack("SSS") and n.pack("sss");n.pack("ccc") and n.pack("CCC"); n.pack("qqq") and n.pack("QQQ") n.pack("SSS") and n.pack("sss");n.pack("ccc") and n.pack("CCC"); n.pack("qqq") and n.pack("QQQ")给出了相同的输出。 然后,其中的差异?

而且文档也没有涉及一点例子的每个指令如何在现实生活中的项目工程的。 我还与以下指令困惑,我不知道如何对它们进行测试? 任何微小的代码与他们对我也有帮助:

  • S_, S!
  • S> L> Q>
  • S!< I!<
  • L_, L!

Answer 1:

你问一个关于电脑店如何号码在内存中的基本原则问题。 例如,你可以看看这些了解详情:

http://en.wikipedia.org/wiki/Computer_number_format#Binary_Number_Representation
http://en.wikipedia.org/wiki/Signed_number_representations

作为一个实例采取之间的差Ss ; 两者都用于包装和拆包的16位数字,但一个是有符号整数,另一个是无符号。 当你想解开字符串放回原整数这有显著的意义。

S :16位无符号的装置编号0 - 65535(0 - (2 ^ 16-1))
s :16位有符号整数-32768 - 32767( - (2 ^ 15) - (2 ^ 15-1))(一个比特用于符号)

所不同的可以在这里看到:

# S = unsigned: you cannot pack/unpack negative numbers
> [-1, 65535, 32767, 32768].pack('SSSS').unpack('SSSS')
=> [65535, 65535, 32767, 32768]   

# s = signed: you cannot pack/unpack numbers outside range -32768 - 32767
> [-1, 65535, 32767, 32768].pack('ssss').unpack('ssss')
=> [-1, -1, 32767, -32768]

所以你看,你必须知道数字是如何在计算机内存中表示,为了理解你的问题。 有符号数用一位代表符号,而无符号数并不需要这个额外的位,但不能表示负数则。

这是非常基本的数字是如何表示为在计算机内存中的二进制。

你需要包装,例如其原因是当你需要从一台计算机发送的数字作为字节流到另一个(如通过网络连接)。 你必须收拾整数转换成字节,以便通过流发送。 另一种选择是作为字符串发送的数字; 那么编码和作为两个字符串结束,而不是打包和拆包解码。

还是让我们说你需要调用一个C函数从Ruby的系统库。 用C语言编写系统库上基本整数(INT,UINT,长,短,等)和C-结构(结构)操作。 您将需要调用该系统的方法之前,你的Ruby整数到整数的系统或C-结构转换。 在这些情况下packunpack可用于接口,这样的方法。


对于他们处理的如何表示压缩字节序列字节序的附加指令。 看到这里什么字节序表示,它是如何工作的:

http://en.wikipedia.org/wiki/Endianness

在简化的术语,它只是告诉以何种顺序整数应转换成字节的填充方法:

# Big endian
> [34567].pack('S>').bytes.map(&:to_i)
=> [135, 7]   
# 34567 = (135 * 2^8) + 7

# Little endian
> [34567].pack('S<').bytes.map(&:to_i)
=> [7, 135]   
# 34567 = 7 + (135 * 2^8)


文章来源: How does pack() and unpack() work in Ruby