【问题标题】:Copying binary data with memcpy in c在c中使用memcpy复制二进制数据
【发布时间】:2016-05-10 12:54:24
【问题描述】:

我在使用memcpy时遇到以下问题:

假设一个十六进制数据必须以二进制复制,例如:203800000E820006,然后应用以下指令:

unsigned char buffer[8];
memcpy(buffer,"\x20\x38\x00\x00\x0E\x82\x00\x06",8);

但是,当我以二进制形式写入数据时,它只以二进制形式打印前 2 个字节,因为 \x00 被解释为字符串终止符。如何避免或解决此问题,以便以 8 字符二进制格式表示 16 字符字符串?

【问题讨论】:

  • “只出现”是什么意思?!出现在哪里?另外,为什么是“+1”?这是 8 个字节的数据,对吧?
  • 您的代码很好,您的buffer 数组最终应该正好包含您想要的 8 个字节。为什么说“它只出现在前 2 个字节”?你在做printf("%s", buffer) 还是什么?这是有道理的,因为%s 需要一个以空字符结尾的字符串,所以它在看到一个字符串时就停止了。但是其余的数据都在那里(只是没有打印出来)。
  • @TinoReyna 这不是一个字符串。请不要称它为字符串。如果你打印它,你必须使用知道如何打印 8 字节二进制数据的代码。你在用这样的代码吗?
  • 我认为您的问题是您不清楚包含十六进制数据的字符串的含义。如果你想要字符串"203800000E820006",那么就这样写。 (当然,这是 16 个字节,而不是 8 个字节。)如果您想要一个包含值 0x20、0x38、...、0x00、0x06 的 8 字节数组,这就是您的代码成功创建的内容,但该 8 字节数组是不是字符串,你不能用%sprintf它,你不能用strcpy复制它,等等。
  • @TinoReyna:我说我认为您不应该将其格式化为字符串(因为它不是字符串),但我不建议使用整数数组。 unsigned char 的数组很好。您可以将 8 字节整数存储到 unsigned char 数组的单元格中。

标签: c string binary char memcpy


【解决方案1】:

您拥有的缓冲区不是字符串。您不能通过将其传递给期望字符串的函数来处理它,例如 strcatstrcpystrcmp%s 格式说明符 printf

你有一个字符数组,所以打印它们:

int i;
for (i=0;i<sizeof(buffer);i++) {
    printf("%02hhX ", buffer[i]);
}
printf("\n");

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2017-11-13
    • 2020-02-24
    • 2020-04-22
    • 1970-01-01
    • 2018-04-08
    • 2012-07-13
    • 2011-06-19
    相关资源
    最近更新 更多