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

标签 c

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

}

最佳答案

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 的指针!

关于c - 如何从 char 缓冲区读取到 unsigned long 和 short,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406647/

相关文章:

c - 是否有必要尝试连接到 getaddrinfo() 返回的所有地址?

Python C 互操作性

c - Ghashtable 存储双

c - 最小总和的最优选择

c - 数组,其中每个偶数索引以 2 为动力,奇数索引以 3 为动力

c - 为什么我的 <signal.h> 将 __sig_atomic_t 定义为 int 而不是 volatile int

c - strcat() 的段错误

c - 只读取一行的第一个字符

c++ - 我可以为任何可以进入 Extern C 的 C++ vector 制作一个 C 包装器吗

c - 如果程序在断点处停止,套接字会发生什么行为?