1

编辑:我不确定这段代码是否符合我的想法。有人可以告诉我如何测试它吗?即我的主函数中的缓冲区应该是什么样的?我假设缓冲区具有以下顺序类型(16 位)、长度(32 位)的两个字段的数据。我假设缓冲区是从文件中读取的,并且每个字段都用空格分隔。这些字段以网络字节顺序存储,当我阅读它们时,我必须将它们转换回主机字节顺序。

我期望代码将从文件中读取内容(应该按网络字节顺序)并按主机字节顺序显示内容。我对类型转换以及文件中的网络字节顺序有点困惑,所以我不知道要使用什么值来测试它。另外,我不确定我的代码是否正确编写,做这种事情或对这种转换有更多了解的人可以告诉我我的代码是否正确吗?

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printRecords(char *buffer)
{
     unsigned int recordType;
     unsigned long recordLength;
     char *data;
     char *index;

     if (!buffer)
         printf("Empty buffer\n");

     while(*buffer)
     {
        memcpy(&recordType,(const void *) buffer,2);
        buffer += 3;

        recordType = ntohs(recordType);
        printf("Record type normal: %u\n",recordType);

        memcpy(&recordLength,(const void *) buffer,4);
        buffer += 5;
        recordLength = ntohl(recordLength);
        printf("Record Length normal: %l\n",recordLength);

        break;
     }
}

void main()
{
     char * buffer = "0000000000000001 00000000000000000000000000000001";
     printRecords(buffer);

}
4

1 回答 1

2
char *buffer = malloc(sizeof(buf));

sizeof 表示“buf 类型的大小”,即指向 char 的指针的大小;你可能想要

malloc(strlen(buf) + 1); /* 1 for trailing '\0' */

那么您将字节的值误认为是它们转换为字符串的值:“256”是字节“2”,后跟字节“5”和“6”——“2”不等于 2,“5”不等于到 5 等等。你正在谈论的 256 是 00000001 00000000 (尝试将字节转储到标准输出,你会看到)。

此外,recordType 应该是 uint16_t 类型,而不是无符号的——你永远不会太偏执。

编辑: atoi 采用指向 char 的指针,如

atoi("123")

不是指向 int 的指针!

于 2012-11-15T21:45:15.563 回答