我正在通过一些C ++培训进行工作。到目前为止,还不错,但是我需要一些帮助来加强我正在学习的一些概念。我的问题是我该如何可视化我创建的对象的字节模式。例如,如何打印出结构,长整型,整型等字节模式?
我脑子里很明白,也可以理解学习资料中的图表,我只是想能够以编程方式从我的一些学习程序中显示字节模式。
我意识到这很简单,但是任何答案都将极大地帮助我理解这些概念。
谢谢。
编辑:我主要将XCode用于其他开发项目,但具有适用于Windows7和fedora核心的VM。在工作中,我将XP与Visual Studio 2005配合使用。(我无法发表评论,因为我在这里仍然是n00b:D)
我使用了unwind的解决方案,它与我正在寻找的解决方案有关。我也在想,也许我可以只使用dos DEBUG命令,因为我也想查看内存块。同样,这只是为了帮助我巩固所学内容。再次感谢大家!
您可以使用如下函数来打印字节:
void print_bytes(const void *object, size_t size)
{
// This is for C++; in C just drop the static_cast<>() and assign.
const unsigned char * const bytes = static_cast<const unsigned char *>(object);
size_t i;
printf("[ ");
for(i = 0; i < size; i++)
{
printf("%02x ", bytes[i]);
}
printf("]\n");
}
用法看起来像这样,例如:
int x = 37;
float y = 3.14;
print_bytes(&x, sizeof x);
print_bytes(&y, sizeof y);
这将字节显示为原始数值,以十六进制形式显示,通常用于此类“内存转储”。
在运行“英特尔(R)至强(R)” CPU的随机(据我所知甚至可能是虚拟的)Linux机器上,打印:
[25 00 00 00] [c3 f5 48 40]
这也方便地证明了Intel CPU:s系列确实是endian。
@ user1721803因为您不能取消引用
void *'. I think it's cleaner to have a function like this accept a
const void` ,因为这使得*使用该函数非常简单且省时。应避免使用演员表,最好将其包含在需要的地方,而不是将其强加于他人。@unwind为什么用位和每个字节这样做
0xff
?有必要吗?@JoãoAlmeida不,不应该这样。我猜只是一种悬念而已。我不喜欢该内容,因此现在将其编辑掉。谢谢。
错误:从'const void *'到'const unsigned char *'的无效转换[-fpermissive] const unsigned char * const bytes = object;