我很难理解Perl的命令print
是如何解释十六进制值的。我正在使用一个只有8行的简单程序来演示我的问题。与gdb
下面的代码会解释我的问题详细:命令行输入到C程序中(使用'print'命令的Perl)
[email protected]:~/Desktop$ gcc -g code.c
[email protected]:~/Desktop$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) list
1 #include <stdio.h>
2
3 int main(int argc, char* argv[])
4 {
5 int i;
6 for (i =0; i<argc; ++i)
7 printf ("%p\n", argv[i]);
8 return 0;
9 }
(gdb) break 8
Breakpoint 1 at 0x40057a: file code.c, line 8.
(gdb) run $(perl -e 'print "\xdd\xcc\xbb\xaa"') $(perl -e 'print "\xcc\xdd\xee\xff"')
Starting program: /home/anil/Desktop/a.out $(perl -e 'print "\xdd\xcc\xbb\xaa"') $(perl -e 'print "\xcc\xdd\xee\xff"')
0x7fffffffe35d
0x7fffffffe376
0x7fffffffe37b
Breakpoint 1, main (argc=3, argv=0x7fffffffdfe8) at code.c:8
8 return 0;
(gdb) x/2x argv[1]
0x7fffffffe376: 0xaabbccdd 0xeeddcc00
在上面行我已经使用gdb
调试程序。作为命令行参数,我已经传递了两个(十六进制)参数(不包括程序本身的名称):\xdd\xcc\xbb\xaa
和\xcc\xdd\xee\xff
。由于小端架构,这些参数应该被解释为0xaabbccdd
和0xffeeddcc
,但正如您所看到的,上面显示的调试的最后一行显示为0xaabbccdd
和0xeeddcc00
。这是为什么?我在想什么?这也发生在其他一些论点。我请求你帮助我。 (2^32>0xffeeddcc
)。其中,我不知道是否还有任何联系。
Endianness是如何存储多字节标量值(如int)的方式。你程序的参数是字符串。 (如果Little-Endian机器打印出“lleHow o!dlr”会不会很愚蠢?) –
形式\ x ## \ x ## \ x ## \ x ##的输入显示它们包含十六进制值,因此需要对它们进行不同的解释。 – aniliitb10