gpt4 book ai didi

c - 如何打印缓冲区中的数据,无论之间是否有零,直到给定长度

转载 作者:行者123 更新时间:2023-11-30 19:04:37 26 4
gpt4 key购买 nike

我编写了一个简单的程序来读取数据包直到第 3 层并以十六进制格式打印相同的数据。我以十六进制格式输入。我的输出应该与此相同。

输入:

45 00 00 44 ad 0b 00 00 40 11 72 72 ac 14 02 fd ac 14  
00 06 e5 87 00 35 00 30 5b 6d ab c9 01 00 00 01
00 00 00 00 00 00 09 6d 63 63 6c 65 6c 6c 61 6e
02 63 73 05 6d 69 61 6d 69 03 65 64 75 00 00 01
00 01

我能够读取数据包。这是 gdb 中的十六进制转储

(gdb) p packet
$1 = 0x603240 "E"
(gdb) x/32x 0x603240
0x603240: 0x00440045 0x00000000 0x00400b0e 0x00000000
0x603250: 0x00603010 0x0035e587 0xe3200030 0x63206261
0x603260: 0x31302039 0x20303020 0x30203030 0x30302031
0x603270: 0x20303020 0x30203030 0x30302030 0x20303020
0x603280: 0x36203930 0x33362064 0x20333620 0x36206336
0x603290: 0x63362035 0x20633620 0x36203136 0x32302065
0x6032a0: 0x20333620 0x30203337 0x64362035 0x20393620
0x6032b0: 0x36203136 0x39362064 0x20333020 0x36203536

但是当我尝试使用 %s 在控制台中打印数据包时,由于中间有零,我看不到总数据包。但我想打印它直到数据包的长度(我将它作为打印函数的输入)。

控制台输出为:

packet: E

我的打印功能是这样的。

void print(char *packet, int len) {
printf("packet: ");
printf("%s\n\n" , packet );
}

你能告诉我任何其他方法来打印数据包直到len(输入到打印函数)吗?

PS:读取l3信息我没有完成。因此,在 gdb 中,数据包 l3 信息与我的输入有所不同。

最佳答案

C 中的字符串定义为以 '\0' 结尾的字符序列。 (0 字节),以及 %s printf() 的转换说明符用于字符串。因此,解决问题的方法是执行其他操作来打印二进制字节。例如,如果您想打印它们的十六进制值,您可以像这样更改打印函数:

void print(unsigned char *packet, size_t len)
{
for (size_t i = 0; i < len; ++i) printf("%02hhx ", packet[i]);
puts("");
}

注意我还更改了此处的类型:

  • char可以签字。如果您想处理原始字节,最好始终使用 unsigned char .
  • int尺寸可能太小,请始终使用 size_t保证可以容纳您平台上可能的任何大小。
<小时/>

如果您确实想打印编码字符(这对于二进制数据来说不太可能),您可以使用 %cprintf() ,或使用putchar()函数,或fwrite()整个 block 到stdout .

关于c - 如何打印缓冲区中的数据,无论之间是否有零,直到给定长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com