You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言读取文件中short类型二进制数转十进制错误问题求解

问题原因与解决方法

核心错误

  • 你混淆了两种完全不同的存储形式:
    1. 你写的转换函数仅适用于处理由0/1组成的十进制输入值/字符串,比如控制台输入十进制数101,把每一位数字当成二进制位计算得到结果5。
    2. 你从文件读取的是原生以short类型存储的二进制数值,这类数值本身在C语言的short变量中就会被自动解析为对应的十进制值,完全不需要手动做进制转换。
  • 你得到错误结果17的原因是把读取到的内容错误传入了上述不适配的转换函数,额外做了无意义的计算导致结果偏差。

正确实现方法

场景1:文件为二进制格式,数值以short类型原生存储

直接用二进制模式打开文件,调用fread读取对应大小的内容到short变量中即可直接使用,示例代码如下:

#include <stdio.h>
#include <stdlib.h>
// 如果需要处理字节序问题,额外引入下面的头文件
// #include <arpa/inet.h>

int main() {
    // 注意打开二进制文件必须加b标识,避免系统对换行符等做自动转换
    FILE *fp = fopen("你的目标文件路径", "rb");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }

    short arr_size;
    // 直接读取short长度的二进制数据到变量
    if (fread(&arr_size, sizeof(short), 1, fp) != 1) {
        perror("读取数值失败");
        fclose(fp);
        return 1;
    }
    fclose(fp);

    // 可选:如果文件存储的是大端序(网络字节序),和当前主机字节序不一致,加下面这行转换
    // arr_size = ntohs(arr_size);

    // 此时arr_size已经是可用的十进制值,你描述的场景下此处打印结果为5
    printf("读取到的数组大小为:%hd\n", arr_size);
    return 0;
}

场景2:文件为文本格式,存储的是0/1组成的字符串

如果直接用文本编辑器打开文件能看到0000000000000101这类文字内容,说明是文本格式存储的二进制序列,需要先读取字符串再调用库函数转换:

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

int main() {
    FILE *fp = fopen("你的目标文件路径", "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }

    char bin_buf[17] = {0};
    // 读取16位二进制字符串
    if (fgets(bin_buf, 17, fp) == NULL) {
        perror("读取字符串失败");
        fclose(fp);
        return 1;
    }
    fclose(fp);

    // 第三个参数2表示按二进制解析字符串
    long arr_size = strtol(bin_buf, NULL, 2);
    printf("读取到的数组大小为:%ld\n", arr_size);
    return 0;
}

内容的提问来源于stack exchange,提问作者Niv Neuvirth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:45:03