- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Perl 中, pack
和 unpack
有两个模板用于将字节转换为/从十六进制:
h
A hex string (low nybble first).
H
A hex string (high nybble first).
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
H
是人们在考虑将字节转换为十六进制/从十六进制转换时通常的意思。那么
h
的目的是什么? Larry 一定认为有人可能会使用它,否则他不会费心把它包括在内。
h
而不是 H
和 pack
或 unpack
吗? 我正在寻找一个具体的例子;如果你知道一台机器像这样组织它的字节,它是什么,你能链接到一些关于它的文档吗?
h
的示例,例如当您并不真正关心格式是什么时序列化一些数据,只要您可以读回它,但是
H
对此同样有用。我正在寻找一个示例,其中
h
比
H
更有用。
最佳答案
回想一下 MS-DOS 的糟糕日子,某些 OS 功能是通过在寄存器上设置高半字节和低半字节并执行 Interupt xx 来控制的。例如,Int 21 访问了许多文件函数。您可以将高半字节设置为驱动器编号——谁将拥有超过 15 个驱动器?作为该驱动器上请求功能的低半字节等。
Here 是一些旧的 CPAN 代码,它使用您描述的包来设置寄存器以执行 MS-DOS 系统调用。
布莱克!!!我一点也不怀念 MS-DOS...
- 编辑
下面是具体的源代码:下载 Perl 5.00402 for DOS HERE ,解压,
在文件 Opcode.pm 和 Opcode.pl 中,您可以在这里看到 unpack("h*",$_[0]);
的使用:
sub opset_to_hex ($) {
return "(invalid opset)" unless verify_opset($_[0]);
unpack("h*",$_[0]);
}
Different CPUs store integers and floating point numbers in different orders (called endianness) and widths (32-bit and 64-bit being the most common today). This affects your programs when they attempt to transfer numbers in binary format from one CPU architecture to another, usually either “live” via network connection, or by storing the numbers to secondary storage such as a disk file or tape.
Conflicting storage orders make utter mess out of the numbers. If a little-endian host (Intel, VAX) stores
0x12345678
(305419896
in decimal), a big-endian host (Motorola, Sparc, PA) reads it as0x78563412
(2018915346
in decimal). Alpha and MIPS can be either: Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses them in big-endian mode. To avoid this problem in network (socket) connections use thepack
andunpack
formatsn
andN
, the “network” orders. These are guaranteed to be portable.As of perl 5.8.5, you can also use the
>
and<
modifiers to force big- or little-endian byte-order. This is useful if you want to store signed integers or 64-bit integers, for example.You can explore the endianness of your platform by unpacking a data structure packed in native format such as:
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 68040If you need to distinguish between endian architectures you could use either of the variables set like so:
$is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
$is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/;Differing widths can cause truncation even between platforms of equal endianness. The platform of shorter width loses the upper parts of the number. There is no good solution for this problem except to avoid transferring or storing raw binary numbers.
One can circumnavigate both these problems in two ways. Either transfer and store numbers always in text format, instead of raw binary, or else consider using modules like
Data::Dumper
(included in the standard distribution as of Perl 5.005) andStorable
(included as of perl 5.8). Keeping all data as text significantly simplifies matters.The v-strings are portable only up to
v2147483647
(0x7FFFFFFF
), that's how far EBCDIC, or more precisely UTF-EBCDIC will go.
unpack("h*",...)
比
pack("h*",...)
更常用。我确实注意到
return qq'unpack("F", pack("h*", "$hex"))';
在
Deparse.pm
中使用,
IO-Compress
在 Perl 5.12 中使用
pack("*h",...)
pack|unpack("h*"...)
相当罕见,主要用于确定平台字节序...
关于perl - 你什么时候使用 unpack ('h*' ...) 或 pack ('h*' ...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857499/
我尝试在安装了多类型 MFC 库的 visual studio 2015 MFC 上运行以前编写的 MFC c++ 代码。 但是,我这里仍然有 12 个关于缺少函数的错误: IntelliSense:
我正在学习 OOP 并且有疑问。假设我有一个包含 ClassB.h 的文件 ClassA.h,并且在某些时候我的 ClassB.h 需要包含 ClassA .h。 这会产生一个错误,我想我明白为什么会
我开始使用 CUDA 进行编程,在一些示例中我找到了包含文件 cuda.h、cuda_runtime.h 和 cuda_runtime_api.h 包含在代码中。有人可以向我解释一下这些文件之间的区别
我有一些生成正则表达式的代码。那么下面的表达式实际上是: ^(?:\s*((exclude|include|hide|show|protect|risk|dir-merge|merge)),\s*((
我一直在查看一些源代码,以更好地了解我们使用的这款游戏的核心,并编写更可靠、更快速的插件。然后我发现了这段奇怪的代码...... public void setMaxH(double amount)
通常我们会使用标准类型作为 std::unordered_map 的键和值.但现在我需要自定义我自己的键和值类。 键类在block_cache_key.h 中定义如下: #ifndef BLOCK_C
例如,我想要两个头文件,它们可以依赖于另一个头文件中的函数。 //Header1.h file #include Header2.h void h1(){ //... func1(); } v
我正在研究来自 Sedgewick 的 Shell 排序 Algorithms in C part 1-4在第 172 页。 我使用 size (数组的长度),而不是 l和 r (开始和结束);所以我
我在 macOS BigSur 上通过 VMWare 使用 Ubuntu 20.04.2 LTS。我安装了最新版本的 tcl、tcl-dev、tk 和 tk-dev - 版本 8.6。我想编译 Arc
我用我的 glu 和 gl 头文件构建了一个 OpenGL 程序,默认包含在 windows 7 专业版中。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须在我的项目中包含 g
我想在 token 中保留特殊字符,同时仍对特殊字符进行 token 化。说我有话 "H&R Blocks" 我想将其标记为 "H", "R", "H&R", "Blocks" 我读了http://w
关于 hash 作为 trans 参数的另一个问题。在下面的代码中,简单地使用 hash 会给出不正确的结果,但是将其替换为 keys 和 values 会使其正确。怎么了? my @alph1 =
我已经编写了一个 C 程序,它获取屏幕像素的 RGB 值 (0-255),并知道其位置 (x,y)。它可以在 Linux 中运行,但是当我尝试在 Visual Studio (Windows) 中编译
我已经使用 Windows 7 专业版中默认包含的 glu 和 gl 头文件构建了一个 OpenGL 程序。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须将glew head
#include using namespace std; #include //#include int main() { initscr();
h:messages h:form 内的组件还显示与外部组件相关的消息。 如何限制它只显示与包含 h:form 内的组件相关的消息? 我不喜欢用单独的h:message来使我的代码膨胀。每个输入组件的
我下载了示例代码和 cpp 文件,其中包含 list.h、queue.h 和 vector.h 等头文件,如果我尝试构建,我会收到“ fatal error :没有这样的文件或目录编译终止”我想我应该
我有一个编译成功的桌面项目,但是在我向项目添加新配置以支持 Windows Mobile 平台后,我收到以下错误: error C2146: syntax error : missing ';' be
有很多关于这个错误的帖子,但我无法解决它,我希望你能拿出解决方案。我在 Ubuntu 机器上。 ~/graphmap2$ 在这个文件夹中,我下载了 zlib。可以看图 经过一番谷歌搜索后,我还注意到没
是否可以在 Visual C++ 中使用以下 header : 图.h dos.h bios.h 最佳答案 据我所知,无法在 Visual C++ 中使用它, 与此同时,我希望您关注 Open Wat
我是一名优秀的程序员,十分优秀!