You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Socket读取图片与本地文件读取大小不一致的问题?

问题分析与解决

核心原因:图片是二进制数据,不能用字符串读取

  • 二进制与文本编码的本质冲突:图片属于无编码的原始二进制数据(比如JPG/PNG的字节流没有文本编码规则),而StreamReader是专门处理文本数据的工具。它会把字节按指定encoding(如UTF-8、GBK)解码成字符串,这个过程会篡改原始二进制字节——比如无法被编码识别的字节会被替换成占位符(如�),多字节编码会拆分/合并原始字节,最终转存成字节时,体积必然和原始文件不一致。
  • 体积变大的具体逻辑:举个例子,原始二进制里的单个字节0xFF,用UTF-8读取时会被判定为无效序列,StreamReader会将其替换为0xEF 0xBF 0xBD(UTF-8标准替换字符),1个字节变成3个,直接导致文件体积膨胀。

正确处理方式:直接读取二进制字节流

绝对不能把二进制文件内容读取为字符串。正确做法是直接操作字节流,示例代码如下:

var request = context.Request;
Stream body = request.InputStream;
using (MemoryStream ms = new MemoryStream())
{
    body.CopyTo(ms);
    byte[] imageBytes = ms.ToArray();
    // 此处可将imageBytes写入文件或做其他二进制操作
}

关于“隐藏字符”的说明

你看到的“隐藏字符”并非HTTP请求自带的额外内容,而是编码转换产生的无效/替换字符。这类字符没有实际意义,也不需要刻意移除——从根源上避免用字符串读取二进制数据,就能彻底解决这个问题。


内容的提问来源于stack exchange,提问作者Mike Croteau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:07:05