我想从缓冲区打印十六进制值。
message1 = calloc(1, sizeof(Message01_t));
message1->number= clientNumber;
char buffer[BUFFERSIZE];
size_t bufferLen = sizeof(buffer);
der_encode_to_buffer(&asn_DEF_Message01, message1, buffer, bufferLen);
xer_fprint(stdout, &asn_DEF_Message01, message1);
for(j=0; j<sizeof buffer ; j++)
printf("%02x ", buffer[j]);
如果我将sizeof缓冲区更改为5,我将得到结果我除了但是使用此代码我会得到类似
的内容Enter a number :
4
<Message01>
<number>4</number>
</Message01>
30 03 02 01 04 00 00 00 00 00 00 00 00 00 00 00 00 00 ......... A LOT OF ZEROS
答案 0 :(得分:0)
答案 1 :(得分:0)
首先,你有BUFFERSIZE暗示它是全球性的。您也可以将长度设置为相同尺寸。
如果要在响应中查找变量长度,则需要使用strlen()
size_t strlen(const char *s);
strlen()函数计算s指向的字符串中的字节数,不包括终止空字节。 strlen()函数返回s的长度;没有保留返回值来表示错误。
这假设您从输入或从您的输入接收到空终止符'\ 0'。对于带有c的字符串,以下字符串“Hi”可以看作char数组{'H','i','\ 0'}。如果你没有null终止符,那么我不知道如何处理不同的长度,除非有一个返回值或int你可以用函数设置。
修改强>
此外,如果您正在寻找char或int的十六进制值也很重要,因为它们不相同。在您的示例中,用户输入“4”,您将显示字符“4”的十六进制值,然后是空终止符“\ 0”。如果您想要显示数字4的十六进制值,则需要将字符串转换为整数:
int atoi(const char *str);
或:
(int) strtol(str, (char **)NULL, 10);
然后您可以显示该数字的十六进制值。这假设用户提供的信息是整数值。如果不是这样,那么只看字符串可能是你最好的选择。
答案 2 :(得分:0)
请记住编译器会将sizeof buffer
替换为数组长度(以字节为单位)BUFFERSIZE
。因此
for(j=0; j<sizeof buffer ; j++)
不会按预期执行,但始终等于
for(j=0; j<BUFERSIZE; j++)
这就是垃圾值(在你的情况下为0x00)来自的地方。
这意味着您必须在运行时确定“实际”缓冲区大小。由于我不知道你正在调用的函数,我恐怕无法告诉你如何,strlen()
,如同@houckrj建议的那样,如果(a)你的缓冲区永远不会包含值0x00和( b)der_encode_to_buffer()
将使用'\0'
终止缓冲区。
如果你不能依赖它,你将不得不寻找另一种方式。