c# byte[] 和 string 如何转换

发布时间 - 2026-01-05 00:00:00    点击率:
C#中byte[]与string转换必须显式指定编码,推荐UTF-8;Encoding.Default不可靠,GB2312等旧编码需额外配置;Base64和BitConverter非编码转换;接收数据时须用实际长度解码。

byte[]string 的转换在 C# 中不是“无损直连”,而是依赖编码(Encoding)的有损映射过程。直接用 Encoding.Default 或乱配编码,轻则中文变问号,重则解码失败抛 ArgumentException 或静默截断。


Encoding.UTF8 是最安全的默认选择

绝大多数现代场景(网络通信、JSON、文件存储、API 交互)都默认使用 UTF-8。它兼容 ASCII,能正确表示中文、emoji、特殊符号,且 .NET 默认字符串内部是 UTF-16,但跨边界传输时 UTF-8 是事实标准。

string text = "你好,Hello ?";
byte[] bytes = Encoding.UTF8.GetBytes(text);
string roundTrip = Encoding.UTF8.GetString(bytes); // ✅ 正确还原
  • ✅ 推荐始终显式写 Encoding.UTF8,别用 Encoding.Default(它随系统区域设置变化,Windows 上可能是 GB2312/GBK,Linux/macOS 上通常是 UTF-8,极难统一)
  • ⚠️ Encoding.Unicode 实际对应 UTF-16 LE(带 BOM),生成的 byte[] 长度是 UTF-8 的约 2 倍,且在网络传输中容易被中间件误判或截断
  • Encoding.ASCII 只支持 0–127,遇到中文会变成 ? 或直接丢字节

接收字节数组时必须知道原始编码,否则无法还原

常见错误:从 socket、串口、文件读到一坨 byte[],直接 Encoding.UTF8.GetString(buffer),结果中文全乱码。

  • 真实场景中,编码信息通常来自协议约定(如 HTTP Content-Type: text/plain; charset=utf-8)、文档说明,或对方明确告知
  • 如果你控制发送端,就固定用 UTF-8 并文档化;如果对接第三方,先查清其输出编码(比如旧系统可能用 GB2312
// 对方明确说“数据是 GB2312 编码”
byte[] gb2312Bytes = File.ReadAllBytes("legacy.txt");
string legacyText = Encoding.GetEncoding("GB2312").GetString(gb2312Bytes);
  • Encoding.GetEncoding("GB2312") 在 .NET Core/.NET 5+ 需要额外安装 System.Text.Encoding.CodePages NuGet 包并调用 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
  • 不推荐在新项目中主动用 GB2312 / BIG5 等旧编码,除非维护遗留系统

不要用 BitConverter.ToString()Convert.ToBase64String() 替代编码转换

它们用途完全不同:

  • BitConverter.ToString(bytes) → 把每个字节转成两位十六进制 + 连字符(如 "48-65-6C-6C-6F"),本质是调试/日志用的可读表示,不是文本内容本身
  • Convert.ToBase64String(bytes) → 是二进制安全编码,用于把任意 byte[](含 \0、控制字符等)转成纯 ASCII 字符串,常用于 JWT、HTTP Authorization、URL 参数等
  • 它们和“字符串内容 ↔ 字节语义”无关:你不能把 "你好" 先转 Base64 再当普通字符串显示,那只是乱码(如 "6L+Z5piv"
string original = "abc";
byte[] utf8Bytes = Encoding.UTF8.GetBytes(original);
string base64 = Convert.ToBase64String(utf8Bytes); // "YWJj"
string decoded = Encoding.UTF8.GetString(Convert.FromBase64String(base64)); // ✅ 还原为 "abc"
// 但 base64 本身不是“字符串”,它只是字节的编码载体
  • ✅ Base64 适合:需要把二进制塞进文本字段(XML、JSON、URL)的场景
  • ❌ Base64 不适合:代替 Encoding 做自然语言文本转换

接收网络/IO 数据时记得处理实际长度,别直接用整个 buffer

典型坑:用 socket.Receive(buffer) 读取,返回值是真实接收字节数 int actualLength,但很多人直接传 buffer.LengthGetString,导致末尾一堆 \0 或乱码。

byte[] buffer = new byte[1024];
int received = client_socket.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, received); // ✅ 关键:用 received,不是 buffer.Length
  • Encoding.UTF8.GetString(buffer) 会尝试解码整个数组,包括未填充部分(可能全是 0),而 UTF-8 解码器对 \0 敏感,可能提前终止或报错
  • 同理,Encoding.UTF8.GetString(bytes, offset, count)count 必须准确 —— 它不是“最大长度”,而是“有效字节数”

真正麻烦的地方不在怎么写,而在于:编码从来不是孤立操作,它是协议的一部分。发的人没说清楚用什么编码,收的人再怎么选对 Encoding 类也白搭。


# linux  # js  # json  # windows  # 编码  # 字节  # mac  # ai  # macos  # win  # c#  # cos  # .net  # 中间件  # String  # count  # xml  # 字符串  # int  #   # Length  # default  # bom  # ASCII  # http  # 的人  # 转成  # 你好  # 如果你  # 文档  # 自然语言  # 很多人  # 两位  # 你不  # 它是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  java ZXing生成二维码及条码实例分享  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何挑选高效建站主机与优质域名?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何正确下载安装西数主机建站助手?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel如何使用Telescope进行调试?(安装和使用教程)  简单实现Android文件上传  高端网站建设与定制开发一站式解决方案 中企动力  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Python高阶函数应用_函数作为参数说明【指导】  如何实现建站之星域名转发设置?  如何为不同团队 ID 动态生成多个非值班状态按钮  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel如何实现一对一模型关联?(Eloquent示例)  网站制作软件有哪些,制图软件有哪些?  Swift中循环语句中的转移语句 break 和 continue  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何彻底删除建站之星生成的Banner?  如何在万网开始建站?分步指南解析  网站建设保证美观性,需要考虑的几点问题!  如何自定义建站之星网站的导航菜单样式?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何创建自定义Facades?(详细步骤)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  java获取注册ip实例  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出