如何从char缓冲区读取到unsigned long和short

时间:2012-11-15 21:35:43

标签: c

编辑:我不确定这段代码是否符合我的想法。有人能告诉我如何测试吗?即我的main函数中的缓冲区应该是什么样的?我假设缓冲区具有以下顺序类型(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);

}

1 个答案:

答案 0 :(得分: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(尝试将字节转储到stdout,你会看到)。

另外,recordType应该是uint16_t类型,而不是unsigned - 你永远不会太偏执。

编辑:atoi获取指向char的指针,如

atoi("123")

不是指向int的指针!