BinaryWriter 字符串

c# 字符串二进制写入,再读出时字符串前面有多余字符

binaryWriter w = new BinaryWriter(fs,Encoding.Default);

string content = "ABC";

w.Write(content); //再用二进制读取时,前面会有个乱码

按下面的方法写入,再读取就没有乱码了

byte[] data = Encoding.UTF8.GetBytes(content);
w.Write(data, 0, data.Length);

在 C# 中,将 **字符串数组转为字节数组(`byte[]`)** 需要明确你希望如何“合并”这些字符串以及使用何种编码方式。常见的需求包括: - 将多个字符串按某种规则拼接后统一编码; - 每个字符串独立编码并保留分隔信息(可用于反序列化); - 用于网络传输、文件存储或加密等场景。 --- ## ✅ 场景一:所有字符串拼接成一个整体 → 转为字节 ### 🔧 方法:先 `string.Join()` 拼接,再用 `Encoding.UTF8.GetBytes()` ```csharp string[] stringArray = { "Hello", "世界", "C#" }; // 使用分隔符拼接(例如换行符或逗号) string combined = string.Join("\n", stringArray); // 用 "\n" 分隔 // 转为 UTF-8 字节数组 byte[] bytes = Encoding.UTF8.GetBytes(combined); ``` > ⚠️ 优点:简单高效;缺点:如果原始字符串本身含有分隔符,则反向解析可能出错。 --- ### 🔄 反向还原(字节 → 字符串数组) ```csharp string restoredString = Encoding.UTF8.GetString(bytes); string[] restoredArray = restoredString.Split('\n'); ``` --- ## ✅ 场景二:安全地序列化字符串数组(推荐用于复杂数据) 为了防止分隔符冲突,可以使用更安全的方式,比如每项前加长度头(类似 .NET 的 `BinaryWriter` 做法)。 ### 🔧 方法:逐个写入,并记录每项的长度(UTF-8 编码 + 前缀长度) ```csharp using System; using System.IO; using System.Text; public static byte[] StringArrayToBytes(string[] strings) { using (var ms = new MemoryStream()) using (var writer = new BinaryWriter(ms, Encoding.UTF8)) { writer.Write(strings.Length); // 先写入数组长度 foreach (var str in strings) { writer.Write(str); // BinaryWriter 自动处理字符串编码和长度 } return ms.ToArray(); } } ``` ### 🔄 反向还原:从字节恢复字符串数组 ```csharp public static string[] BytesToStringArray(byte[] bytes) { using (var ms = new MemoryStream(bytes)) using (var reader = new BinaryReader(ms, Encoding.UTF8)) { int count = reader.ReadInt32(); var strings = new string[count]; for (int i = 0; i < count; i++) { strings[i] = reader.ReadString(); } return strings; } } ``` ### ✅ 示例调用 ```csharp string[] original = { "Apple", "Banana", "你好", "C#编程" }; // 序列化为字节 byte[] data = StringArrayToBytes(original); // 反序列化回来 string[] restored = BytesToStringArray(data); foreach (var s in restored) { Console.WriteLine(s); } ``` > ✔ 安全、高效、支持任意字符、不会因分隔符出错。 --- ## ✅ 场景三:简单合并(无分隔符) 如果你只是想把所有字符串连起来当一个大文本处理: ```csharp string[] arr = { "abc", "def", "ghi" }; byte[] bytes = Encoding.UTF8.GetBytes(string.Concat(arr)); ``` 适用于不需要还原单个元素的场景。 --- ## ❌ 错误做法示例 ```csharp // ❌ 不要这样做!这不是有效的转换 byte[] bad = (byte[])stringArray; ``` 这会编译失败,因为类型不兼容。 --- ## ✅ 总结:推荐方案对比 | 方式 | 是否推荐 | 适用场景 | |------|----------|-----------| | `string.Join("\n", arr)` + UTF8编码 | ✅ 简单场景 | 日志、配置导出 | | `BinaryWriter.WriteString()` + 长度头 | ✅✅✅ 强烈推荐 | 序列化、网络通信、持久化 | | `string.Concat()` 合并 | ⚠️ 特定用途 | 不需拆分回原数组 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值