BinaryWriter.Write(string) 写乱码因WriteString()采用带长度前缀的UTF-8格式(先写变长整数长度,再写UTF-8字节),手动Write(byte[])或跨语言对接时格式不匹配会导致ReadString()失败;结构体需显式控制字段顺序、填充和类型;必须用using确保Flush()和Close();FileStream模式须匹配读写需求。

BinaryWriter.Write(string) 为什么会写乱码或读不出来
根本不是编码选错了,而是 WriteString() 写的是“带长度前缀的 UTF-8 字符串”——它先写一个变长整数(最多 5 字节)表示后续字节数,再写 UTF-8 编码内容。如果你用其他工具(比如 C++ 的 fwrite())直接写 raw 字节,或者用 Write(byte[]) 手动写字符串字节,BinaryReader.ReadString() 就会去错位置读长度,大概率抛 EndOfStreamException 或解出乱码。
常见翻车点:
- 用
Encoding.UTF8.GetBytes("abc")+Write(byte[])写字符串,却指望ReadString()能读回来 → 不行,格式不匹配 - 构造
BinaryWriter时传了Encoding.ASCII,但WriteString()仍按 UTF-8 写长度前缀 → 编码参数只影响字符解码,不影响长度协议 - 跨语言对接时默认依赖
WriteString()→ 实际应约定固定长度、空终止或自定义头,别碰这个“黑盒协议”
写结构体数据时字段偏移、值错位怎么办
BinaryWriter 没有 Write(MyStruct) 方法,它不会自动理解字段顺序、对齐或填充。C# 默认结构体可能因 CPU 架构或编译器插入 padding 字节,直接 Marshal.Copy() 又不保证 blittable,结果就是读出来 X 是 0、Y 是乱码、bool 当成了 int。
安全做法是手动逐字段写,显式控制类型和大小:
- 给结构体加
[StructLayout(LayoutKind.Sequential, Pack = 1)],禁用填充 - bool 别直接
Write(bool)→ 改用Write((byte)(isActive ? 1 : 0)),避免不同平台解释差异 - 浮点数统一用
Write(double)或Write(float),别混用Write(1.0)(推导为double)和Write(1.0f)(float),长度差 4 字节 - 数组字段要先写长度,再循环写每个元素,否则读端无法知道边界
写完文件为空或缺最后几 KB 数据
不是磁盘坏了,是缓冲区没刷出去。BinaryWriter 默认带 4096 字节缓冲,Write() 只往缓冲里填,不调 Flush() 或 Close(),数据就卡在内存里。尤其用 BufferedStream 包裹时,问题更隐蔽。
必须做且仅需做一件事:用 using 管理生命周期。
- ✅ 正确:
using var fs = new FileStream("data.bin", FileMode.Create); using var w = new BinaryWriter(fs); w.Write(42);→Dispose()自动触发Flush()和Close() - ❌ 错误:
var w = new BinaryWriter(fs); w.Write(42);后没Close()→ 文件可能为空或截断 - ⚠️ 危险:
w.Flush()之后继续写,再忘了Close()→ 缓冲区二次积压,仍可能丢数据
FileStream 模式开错导致 NotSupportedException
BinaryWriter 和 BinaryReader 是流的“翻译层”,它们不负责打开文件,只依赖底层 FileStream 的 CanWrite / CanRead 属性。开错模式,运行时报错毫不留情。
- 想同时读写一个文件?必须用
FileMode.OpenOrCreate+FileAccess.ReadWrite,不能只用FileMode.Create(只写)或FileMode.Open(只读) - 用
FileMode.Append构造BinaryWriter?可以,但只能写,不能读;且写入总在末尾,Seek()无效 - 共享同一个
FileStream实例给多个BinaryWriter?别试 —— 写操作会互相覆盖位置指针,数据必然错乱
最稳的组合永远是:一个 FileStream 实例,配一个 using 块里的 BinaryWriter(或 BinaryReader),写完即弃。跨方法传递时,只传 Stream,别传 BinaryWriter 实例本身。


















