如何将指针指向的字节复制到char[]?FAT32镜像内存映射问题
解决FAT32镜像映射后字节复制与前导零显示问题
嘿,我来帮你理清这个问题!首先要明确:内存里的字节根本没丢,你看到的“前导零丢失”只是打印方式导致的视觉效果而已。
问题本质
你用mmap映射后的内存中,address[8]确实是0x02,address[9]是0x00——但当你直接打印这两个char类型的值时,printf默认会以十进制整数输出:
0x02的十进制就是2,所以打印出来是2;0x00的十进制就是0,所以打印出来是0;
而address[0]是0x43(十进制67)、address[1]是0x53(十进制83),刚好十进制数值和你预期的十六进制字符对应的十进制一致,所以看起来“正确”,但本质都是十进制输出的结果。
如何把指针指向的字节复制到char[]中
复制字节本身非常直接,不需要特殊处理,因为内存里的原始字节是完整的,直接用赋值或者memcpy就能完整复制:
方法1:直接赋值
// 推荐用unsigned char处理字节,避免符号问题 unsigned char* address = ...; char buf[2]; buf[0] = address[8]; buf[1] = address[9];
方法2:用memcpy批量复制
如果需要复制多个字节,memcpy更高效:
#include <string.h> unsigned char* address = ...; char buf[2]; memcpy(buf, &address[8], 2); // 从address+8的位置复制2个字节到buf
复制完成后,buf[0]就是0x02,buf[1]就是0x00,和内存中的原始字节完全一致。
如何打印出带前导零的十六进制格式
如果你的需求是打印时显示前导零(比如把0x02显示成02,0x00显示成00),那需要用格式化输出的技巧:
- 使用
%02x格式符:02表示输出两位十六进制数,不足两位时用前导零补齐; - 注意把char转成
unsigned char,避免有符号char的负数问题(比如如果字节是0x80,有符号char会被解析成-128,转成unsigned char才能正确显示为80)。
示例代码:
printf("address[8] = %02x\n", (unsigned char)address[8]); // 输出02 printf("address[9] = %02x\n", (unsigned char)address[9]); // 输出00 // 打印buf中的内容 printf("buf[0] = %02x\n", (unsigned char)buf[0]); // 输出02 printf("buf[1] = %02x\n", (unsigned char)buf[1]); // 输出00
总结
- 字节复制:直接赋值或
memcpy即可,原始字节不会丢失; - 前导零显示:是输出格式化的问题,用
%02x配合unsigned char转换就能实现。
内容的提问来源于stack exchange,提问作者Zero Sun
相关产品推荐
相关产品推荐

