当我从C中的数组中获得十六进制值时,如何保留十六进制格式?
我有一个这样的数组:当我从C中的数组中获得十六进制值时,如何保留十六进制格式?
unsigned char arr[] = {0x55};
unsigned char byte = arr[0];
而且我希望有一个字节是十六进制表示,就像它是在数组中。 但是,当我在gdb中查看它时,我一直得到该字节是85'U'。发生了什么?为什么我看不到0x55,甚至是二进制表示110111?
感谢您的帮助!
使用p/x byte
来查看它。除非另有说明,否则gdb
默认为打印小数。您得到'U'
,因为这也是打印char
类型变量的默认值的一部分。
存储在变量中的值是二进制的 - 我认为这只是你如何看待它而使你感到困惑。 0x55
,85
和'U'
都是解释相同数据的不同方式。
使用正确的formatting flags on print:
任何我当然希望你的编译器,使0x55的成0x01010101,没有别的。
我不想打印,我只是想保留十六进制或二进制值,所以我可以做转换和其他操作。谢谢 – user2057841 2013-02-10 22:40:00
对,所以你说“gdb显示变量为U或85”,这是二进制数字0x01010101的字符和十进制表示形式。在计算机中,所有数字都以二进制形式存储。当您打印它们时,它们的显示方式对我们如何阅读它们有所影响。你的号码是相同的,无论是显示为U还是85,还是0x55或0125(最后一个是八进制) - 这只是一个如何让人可读的问题。 – 2013-02-10 22:42:36
好的。我看到,二进制文件应该是0x01010101。但是如果我做x/wt和字节,我得到:11110111111110000010111101010101。开头的所有数字在哪里?我只想在末尾输入正确的数字 – user2057841 2013-02-10 22:44:43
GDB向您显示对应于0x55
字符代码的可打印字符,因为您拥有的值是char
类型。要以十六进制打印它,请使用:
(gdb) p/x byte
哦,好的,谢谢!我正在使用x/wt来打印,并且没有打印正确的二进制文件。我尝试了你的建议,它打印0x55。这是否意味着它实际上存储了正确的值?我怎样才能看到二进制表示? – user2057841 2013-02-10 22:40:29
对不起,我昨天刚刚加入网站,不确定工作情况。我想接受多个答案,并且也得票,但我还没有足够的积分来做到这一点。我欠你一个:) – user2057841 2013-02-11 00:02:31
发生了什么事?
什么也没有发生。它不在数组中的十六进制中。它在数组中是二进制的。它在源代码中是十六进制的。如果您想将其格式化为十六进制,请这样做。没有人阻止你。
谢谢。我怎样才能看到二进制表示? – user2057841 2013-02-10 22:42:12
十六进制或八进制是在gdb中最接近的 - 它没有“binary”作为输出格式。 – 2013-02-10 22:46:27
@MatsPetersson,GDB支持'x'和'p'命令的二进制输出。 user2057841,在这种情况下使用'p/t byte'。 – 2013-02-10 22:46:56