Triple_DES算法下:解决fread处理按位存储数组的字节位不匹配问题
问题解决方法
原代码的核心错误在于:fread直接将文件的字节数据写入input_text数组,但input_text是按单个位存储数据的,两者存储粒度不匹配——每个字节需要拆分为8个位才能正确存入目标数组。
修正步骤
- 先将文件的字节数据完整读取到临时缓冲区(按字节存储,匹配
fread的处理逻辑) - 遍历临时缓冲区的每个字节,将其拆解为8个独立的位,依次写入
input_text对应位置 - 根据需求选择位的存储形式(数值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,提问作者이동현
相关产品推荐
相关产品推荐

