c# - 从字节图像中删除字符串
问题描述
你能帮我做那个吗?我正在使用 Vs2019 ,.net core 3.1
我的套接字正在接收图像,我需要从收到的 byte[] 中删除一些字符串。
例如 Socket 接收 Image1,Size,ID,XXXXX (其中 XXXXX 是图像)
我需要删除字符串 (Image1,Size,ID,) 的开头才能将图像保存在磁盘中。如果我解码字符串并使用 string.replace("Image1,Size,ID,",""),它将破坏我的图像并且我将无法生成图像。
更多示例:
byte[] newFile = File.ReadAllBytes("C:\\test.txt"); //Socket is saving data in this file
string strFile = Encoding.ASCII.GetString(newFile);
strFile.Replace("Image1,Size,ID,", "");
byte[] newArray = Encoding.ASCII.GetBytes(strFile);
using (FileStream fsNew = new FileStream("C:\\image.jpg", FileMode.Create, FileAccess.Write))
{
fsNew.Write(newArray, 0, newArray.Length); //Corrupted File is generated.
}
谢谢
解决方案
您不应将二进制数据视为文本,当然也不应将其视为 7 位 ASCII 文本。正如您所发现的那样,这将破坏数据。
完全没有必要参与System.Text.Encoding
这种情况。您知道要跳过多少字节,所以只需跳过它们。Write()
允许您传入要复制的起始偏移量,例如
byte[] newFile = File.ReadAllBytes("C:\\test.txt"); //Socket is saving data in this file
using (FileStream fsNew = new FileStream("C:\\image.jpg", FileMode.Create, FileAccess.Write))
{
fsNew.Write(newFile, 15, newFile.Length-15);
}
如果出于某种原因,您确实需要将二进制数据视为文本,然后再返回二进制,那么至少使用代码页 437 来避免损坏。
byte[] newFile = File.ReadAllBytes("C:\\test.txt"); //Socket is saving data in this file
Encoding enc = Encoding.GetEncoding(437);
string strFile = enc.GetString(newFile);
strFile = strFile.Remove(0, 15);
byte[] newArray = enc.GetBytes(strFile);
using (FileStream fsNew = new FileStream("C:\\image.jpg", FileMode.Create, FileAccess.Write))
{
fsNew.Write(newArray, 0, newArray.Length);
}
推荐阅读
- sql-server - 触发错误,不显示 Raiserror 消息
- python - 在 BeautifulSoup中获取 HTML 标签的文本
- ios - 上传到 App Store Connect 的应用预览视频的格式问题
- css - 带有定位图层的背景图像上的 CSS 灰度
- ios - iOS如何从透明的.png生成纹理网格?
- c++ - 求给定矩阵中的总循环数
- rust - 如何为 syn::parse 找到正确的返回类型?
- android - 更新到 sdk 28 时出现 android gradle 错误
- google-compute-engine - TPU RetinaNet - 类型错误
- ios - 如何检查手表应用程序是否安装在 Swift 中