【问题标题】:Binary file reading, convert 2 bytes to an unsigned short C二进制文件读取,将 2 个字节转换为无符号短 C
【发布时间】:2016-01-18 23:03:46
【问题描述】:

我在一次读取 2 个字节并将其转换为无符号短大端时遇到问题。

这是我当前的代码,我也想打印无符号短大端,应该是数字 25。

所以这段代码是用来读取二进制文件的,我把所有文件都保存到了一个缓冲区,我需要缓冲区[5]和缓冲区[6]到无符号短大端

void read_binair(const char* filename)
    {
        FILE *file;
        char *buffer;
        unsigned long fileLen;
        int i;
        char character;
        Level* level = level_alloc_empty();

        file = fopen(filename, "rb");
        if (!file)
        {
            fprintf(stderr, "Unable to open file %s", filename);
            return;
        }



        fseek(file, 0, SEEK_END);
        fileLen = ftell(file);
        fseek(file, 0, SEEK_SET);


        buffer = (char *)malloc(fileLen + 1);
        if (!buffer)
        {
            fprintf(stderr, "Memory error!");
            fclose(file);
            return;
        }



        fread(buffer, fileLen, 1, file);
        for (i = 0; i < 4; i++) 
        {   
            printf("%c", (char) buffer[i]);
        }
        i = buffer[4];
        printf("%d", i);
        //read buffer[5] and buffer[6] together as a unsigned short, big endian
        fclose(file);
    }

【问题讨论】:

  • 您检查过&lt;&lt;| 运算符吗?
  • 我认为我们需要@unwind。这家伙正在投射 malloc 的返回值。
  • @PeterSchneider 虽然@unwind 不在这里:请不要投射malloc() 的结果。这样做是没有用的,并且可以隐藏错误。
  • @FUZxxl 哈!抓到一个!坡定律仍然有效!
  • 这个问题没有意义,因为你没有提到数字存储在文件中的字节序,也没有提到处理器的字节序。不知道这两件事是不可能回答这个问题的。 (令人惊讶的是,人们仍然试图回答......)

标签: c binary unsigned short


【解决方案1】:

以下代码将以大端序从buffer 创建一个unsigned short

unsigned short us = (buffer[5] << 8) | buffer[6];

【讨论】:

  • @Jongware LSB 在buffer[6],它是大端。
  • 我可能很密集,但代码有问题吗?我们是否应该假设数据以小端顺序出现并且我们想要对其进行转换,即对其进行ntohs()? OP 不是很具体。
  • 为什么机器的字节序会影响这里的代码?假设实际的16位数是0xF1E4和buffer[5] = 0xE4buffer[6] = 0xF1,那么(buffer[5] &lt;&lt; 8) | buffer[6];有什么意义呢?
  • @work.bin,你说得对,机器不会影响字节序。
  • 这段代码会有问题应该buffer[6] &lt; 0
【解决方案2】:

假设 -

  1. 您正在使用支持 C99 的编译器,并且
  2. 文件中的数据按网络字节顺序排列

你需要 -

uint16_t half_word = ((uint8_t)buffer[5] << 8) | ((uint8_t)buffer[6])

附: -

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2013-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-06-28
    • 2022-09-22
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多