C++文本转二进制文件运行后输出仍为明文问题求助
核心原因是你对「二进制文件」的概念存在误解
- 所有文件本质上都是二进制文件,我们日常说的「文本文件」只是特殊的二进制文件:它存储的每一个字节的值都刚好对应ASCII/UTF-8等编码的可打印字符,所以用文本编辑器打开可以直接识别为可读文字。
- 你写入char的逻辑是把原文本文件的每个字符原封不动写入新文件,这些字节本身就是可打印的ASCII值,哪怕用
ios::binary模式打开输出流,写入的字节内容也不会发生变化,所以打开后还是明文。 - 你测试写入int类型时得到乱码,只是因为int类型的内存二进制表示里包含大量不可打印字符:比如你写的int值5,32位小端存储的二进制表示为
0x05 0x00 0x00 0x00,其中0x00是空字符,属于不可打印字符,文本编辑器无法识别就会显示为乱码,这不是什么「正确的二进制文件格式」,只是存储的内容不可打印而已。
ios::binary的作用不是转码
ios::binary标记唯一的作用是禁用流的换行符自动转换逻辑:在Windows平台下,文本模式写入\n会自动转换为\r\n,读取时\r\n会自动转换为\n;加上ios::binary标记后,流会严格按照你写入的字节内容读写,不做任何转换,完全不会修改你输入的字节值。
你的代码没有逻辑错误,只是没有达到你预期的「转码」效果
你当前的代码本质上就是做了一次文件复制,只是输出文件用二进制模式打开而已,没有对原内容做任何编码转换。如果你想要得到不可读的二进制文件,你需要自己定义编码规则对原文本内容做转换,比如:
- 将文本中的数字字符串转换为对应的整型/浮点型二进制存储
- 自定义加密规则对原文本字节做加密后存储
- 把文本内容序列化到自定义的二进制结构体中存储
内容的提问来源于stack exchange,提问作者tommyd
相关产品推荐
相关产品推荐

