C#中实现多Base64字符串与单字节数组互转的方法
多Base64字符串与单字节数组互转方案
需求说明
实现两个方法,将多个Base64编码字符串合并为单个字节数组,且能将该字节数组还原为原多个字符串,要求不能使用二维字节数组。考虑过插入分隔符的方式,想了解是否存在字节标准分隔符。
方案解析
不存在能完全避免冲突的“标准字节分隔符”——因为Base64解码后的字节可以是0-255的任意值,任何单个字节都有可能出现在原字符串解码后的字节流中,用分隔符的话会有拆分错误的风险。更可靠的方案是给每个字符串对应的字节块添加长度前缀,通过长度信息来准确拆分数据,无需依赖分隔符。
代码实现
合并方法(TransformStringsIntoBytes)
该方法先将每个Base64字符串解码为字节数组,然后把每个字节数组的长度(用4字节int存储,保证跨平台兼容性)和字节内容依次写入最终的合并字节数组:
public byte[] TransformStringsIntoBytes(string[] base64EncodedStrings) { using (var ms = new MemoryStream()) using (var writer = new BinaryWriter(ms)) { // 先写入字符串总数,方便还原时知道要读取多少个块 writer.Write(base64EncodedStrings.Length); foreach (var str in base64EncodedStrings) { if (string.IsNullOrEmpty(str)) { writer.Write(0); continue; } byte[] bytes = Convert.FromBase64String(str); // 写入当前字节块的长度 writer.Write(bytes.Length); // 写入字节块内容 writer.Write(bytes); } return ms.ToArray(); } }
拆分方法(TransformBytesIntoStrings)
修正原方法的参数错误(应该接收byte[]而非string[]),该方法先读取字符串总数,再依次读取每个块的长度和对应字节内容,最后编码回Base64字符串:
public string[] TransformBytesIntoStrings(byte[] byteArray) { using (var ms = new MemoryStream(byteArray)) using (var reader = new BinaryReader(ms)) { int count = reader.ReadInt32(); string[] result = new string[count]; for (int i = 0; i < count; i++) { int length = reader.ReadInt32(); if (length == 0) { result[i] = string.Empty; continue; } byte[] bytes = reader.ReadBytes(length); result[i] = Convert.ToBase64String(bytes); } return result; } }
方案优势
- 无需担心分隔符冲突问题,拆分逻辑完全可靠
- 支持空字符串的处理
- 用
BinaryWriter和BinaryReader处理长度,保证数据在不同平台下的一致性
内容的提问来源于stack exchange,提问作者Brudi_Voeller
相关产品推荐
相关产品推荐

