首页 > 解决方案 > 从字节图像中删除字符串

问题描述

你能帮我做那个吗?我正在使用 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. 
            }

谢谢

标签: c#arraysimagesocketsbyte

解决方案


您不应将二进制数据视为文本,当然也不应将其视为 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);
}

推荐阅读