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

Triple_DES算法下:解决fread处理按位存储数组的字节位不匹配问题

问题解决方法

原代码的核心错误在于:fread直接将文件的字节数据写入input_text数组,但input_text是按单个位存储数据的,两者存储粒度不匹配——每个字节需要拆分为8个位才能正确存入目标数组。

修正步骤

  1. 先将文件的字节数据完整读取到临时缓冲区(按字节存储,匹配fread的处理逻辑)
  2. 遍历临时缓冲区的每个字节,将其拆解为8个独立的位,依次写入input_text对应位置
  3. 根据需求选择位的存储形式(数值0/1或字符'0'/'1')

修正后的完整代码

fseek(Ptr_input, 0, SEEK_END);  
file_size = ftell(Ptr_input);   
fseek(Ptr_input, 0, SEEK_SET); 

// 分配按位存储的数组:每个位占一个char,预留终止符空间
char* input_text = (char*)malloc((file_size) * 8 + 1);
if (input_text == NULL) {
    printf("malloc failed.\n");
    fclose(Ptr_input);
    exit(1);
}

// 临时缓冲区:存储读取到的字节数据
unsigned char* byte_buffer = (unsigned char*)malloc(file_size);
if (byte_buffer == NULL) {
    printf("malloc failed.\n");
    free(input_text);
    fclose(Ptr_input);
    exit(1);
}

// 读取全部字节数据
size_t read_bytes = fread(byte_buffer, 1, file_size, Ptr_input);
if (read_bytes != file_size) {
    printf("fread failed.\n");
    free(byte_buffer);
    free(input_text);
    fclose(Ptr_input);
    exit(1);
}

// 将每个字节拆解为8个位,写入input_text
for (size_t i = 0; i < file_size; i++) {
    unsigned char current_byte = byte_buffer[i];
    // 从高位到低位拆解(如需低位到高位,将bit循环改为0到7)
    for (int bit = 7; bit >= 0; bit--) {
        int bit_value = (current_byte >> bit) & 1;
        // 存储为字符形式('0'/'1'),若需数值0/1,直接赋值bit_value即可
        input_text[i * 8 + (7 - bit)] = bit_value ? '1' : '0';
    }
}
// 添加字符串终止符(如果input_text作为字符串使用)
input_text[file_size * 8] = '\0';

// 释放临时缓冲区
free(byte_buffer);

关键细节说明

  • 位顺序调整:代码默认从字节高位到低位拆解,若业务需要低位优先,只需将内层循环的bit从0遍历到7,并调整input_text的索引计算
  • 内存管理:新增临时缓冲区的分配与释放,同时为input_text预留了字符串终止符空间(无需字符串形式可去掉)
  • 错误处理:补充fread读取失败的判断,避免数据不完整导致后续位拆解错误

内容的提问来源于stack exchange,提问作者이동현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:25