得到一个缓冲区的大小

时间:2014-05-12 17:06:48

标签: c buffer

我想从缓冲区打印十六进制值。

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

3 个答案:

答案 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'终止缓冲区。 如果你不能依赖它,你将不得不寻找另一种方式。