c - 如何打印(或转储)任何类型的十六进制指针?
问题描述
我在这里问你一个关于内核开发的问题(特定于 x86 处理器),我的问题是:我想显示任何指针的十六进制地址。
我尝试了很多东西,为自己弄清楚了,但我碰到了这堵墙。
我自己实现的所有打印功能,它们都在工作。记住:我在一个独立的环境中编码(GCC 的东西)。
到目前为止,这是我正在做的事情:
void testPrintHex(void* someptr) {
const char* hexDigits = "0123456789ABCDEF";
uint32_t* ptr = (uint32_t*) someptr;
print("0x");
for(size_t i = 0; i < 32; i+=8) {
char c = ptr[i];
char low = c & 0x0F;
char high = (c >> 4) & 0x0F;
for(int j = 0; j <= 16; j++) {
char h = (hexDigits[j] >> 4) & 0x0F;
if(high == h) {
printChar(h);
}
}
for(int j = 0; j <= 16; j++) {
char l = hexDigits[j] & 0x0F;
if(low == l) {
printChar(l);
}
}
}
print("\n");
}
我希望这能打印出这个指针的内存地址。我得到什么?这个:0x
哦,Stack Overflow 没有显示 12 个(2 个黑桃、2 个笑脸、6 个正方形和 2 个红心)奇怪符号。
解决方案
假设您要打印指针指向的下 4 个字节,则要简单得多:
void testPrintHex(void* someptr) {
const char* hexDigits = "0123456789ABCDEF";
uint8_t* ptr = (uint8_t*) someptr;
print("0x");
for(size_t i = 0; i < 4; i++) {
char c = ptr[i];
char low = c & 0x0F;
char high = (c >> 4) & 0x0F;
printChar(hexDigits[high]);
printChar(hexDigits[low]);
}
print("\n");
}
推荐阅读
- paypal - 用 REST API V2 替换 PayPal SetExpressCheckout SOAP API
- javascript - 存储来自不同意图的多个参数
- scala - 如何使用 scala 收集方法来制作相关系数的方法?
- typescript - NestJS:在异常过滤器之前执行拦截器
- java - 仅发布问题 | 应用程序:lintVitalRelease
- python - 如何在 MacOS Mojave 上安装 Pygame?
- python - Pandas 创建 Excel 表格,表格格式为表格
- c - Switch Case 中的 Switch Case - 是否使用跌落式机箱,然后使用相同跌落式的新 Switch Case,这是一种糟糕的设计理念?
- javascript - 防止内容注入到 HTTP 请求标头中
- bash - 在后台运行 tcpdump linux