代码之家  ›  专栏  ›  技术社区  ›  cjm

什么时候使用unpack('h*'…)或pack('h*'…)?

  •  11
  • cjm  · 技术社区  · 14 年前

    在Perl中, pack unpack 有两个用于将字节转换为十六进制/从十六进制转换为十六进制的模板:

    h 十六进制字符串(首先是低位nybble)。
    H

    最好用一个例子来说明这一点:

    use 5.010; # so I can use say
    my $buf = "\x12\x34\x56\x78";
    
    say unpack('H*', $buf); # prints 12345678
    say unpack('h*', $buf); # prints 21436587
    

    如你所见, 小时 ? 拉里一定以为有人会用它,否则他不会费心把它包括在内。

    小时 而不是 小时 具有 包装 ? 我在找一个具体的例子;如果你知道一台机器是这样组织字节的,它是什么,你能链接到它的一些文档吗?

    使用 ,例如,当您不真正关心格式是什么时序列化一些数据,只要您可以将其读回,但是 小时 小时 更多 有用的 小时

    3 回复  |  直到 14 年前
        1
  •  11
  •   dawg    14 年前

    回忆起过去的糟糕时光 MS-DOS 通过在寄存器上设置高半字节和低半字节并执行中断xx来控制某些操作系统功能。例如,Int 21访问了许多文件函数。您可以将高字节设置为驱动器号--谁将拥有超过15个驱动器??作为该驱动器上请求的函数的低半字节,等等。

    Here

    呜呜!!!我一点也不想念MS-DOS。。。

    下面是特定的源代码:下载Perl 5.00402for DOS HERE ,解压缩,

    unpack("h*",$_[0]); 在这里:

    sub opset_to_hex ($) {
        return "(invalid opset)" unless verify_opset($_[0]);
        unpack("h*",$_[0]);
    }
    

    perlport 对于Perl 5.8-8,有以下建议的目标端性测试:

    不同的CPU将整数和浮点数存储在不同的 命令(调用 末端性 今天最常见)。当程序试图传输时,这会影响程序 从一个CPU架构到另一个CPU架构的二进制数字, 通常通过网络连接或存储

    小端主机(Intel,VAX)存储 0x12345678 ( 305419896 在里面 0x78563412 ( 2018915346 十进制)。Alpha和MIPS可以是: 他们在大端模式。在网络(套接字)中避免此问题 连接使用 pack unpack 格式 n N ,和 网络命令。这些保证是便携式的。

    从Perl5.8.5开始,您还可以使用 > < 修饰语 强制执行大字节或小字节顺序。如果你想的话这很有用

    以本机格式打包的数据结构,例如:

       print unpack("h*", pack("s2", 1, 2)), "\n";
       # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
       # '00100020' on e.g. Motorola 68040
    

    如果需要区分可以使用的endian体系结构 任意一个变量设置如下:

       $is_big_endian    = unpack("h*", pack("s", 1)) =~ /01/;
       $is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/;
    

    不同的宽度甚至会导致相等平台之间的截断 号码。这个问题除了避免 传输或存储原始二进制数。

    我们可以用两种方法来解决这两个问题。或者 传输和存储数字时始终使用文本格式,而不是原始格式 二进制,或者考虑使用如下模块 Data::Dumper (包括在 从Perl 5.005开始的标准发行版)和 Storable 在perl 5.8中)。将所有数据保持为文本可以大大简化问题。

    v字串的便携性仅限于 v2147483647 ( 0x7FFFFFFF EBCDIC,或者更准确地说是UTF-EBCDIC将走多远。

    看来 unpack("h*",...) 使用频率超过 pack("h*",...) . 我注意到了 return qq'unpack("F", pack("h*", "$hex"))'; Deparse.pm IO-Compress 使用 pack("*h",...) 在Perl 5.12中

    Google Code Search list . 你可以看到 pack|unpack("h*"...) 是相当罕见的,主要与确定平台的端部有关。。。

        2
  •  4
  •   rafl    14 年前

        3
  •  1
  •   Eric Strom    14 年前

    H h 要打包的旗子可以给你选择。 V N