C#读取并替换文本文件中的二进制数据

时间:2011-06-28 19:24:29

标签: c# binary

我有一个包含文本数据和二进制数据的文件。这可能不是一个好主意,但我无能为力。 我知道二进制数据的结束和开始位置。

在这些位置之间读取二进制数据的最佳方法是什么,从中创建一个Base64字符串,然后将其写回原来的位置。

编辑:Base64编码的字符串与二进制数据的长度不同,因此我可能需要将Base64字符串填充为二进制数据长度。

3 个答案:

答案 0 :(得分:0)

您将要使用FileStream对象,以及Read(byte [],int,int)和Write(byte [],int,int)方法。

虽然关于base64大于二进制的要点是有效的 - 你实际上需要获取超出你想要替换的结束点的数据,存储它,用你的新数据写入文件,然后写出来完成后存储的数据。

我相信你不是想在这里修改exe文件来编写病毒......;)

答案 1 :(得分:0)

int binaryStart = 100;
int binaryEnd = 150;

//buffer to copy the remaining data to it and insert it after inserting the base64string
byte[] dataTailBuffer = null;

string base64String = null;

//get the binary data and convert it to base64string
using (System.IO.Stream fileStream = new FileStream(@"c:\Test Soap", FileMode.Open, FileAccess.Read))
{
    using (System.IO.BinaryReader reader = new BinaryReader(fileStream))
    {
        reader.BaseStream.Seek(binaryStart, SeekOrigin.Begin);

        var buffer = new byte[binaryEnd - binaryStart];

        reader.Read(buffer, 0, buffer.Length);

        base64String = Convert.ToBase64String(buffer);

        if (reader.BaseStream.Position < reader.BaseStream.Length - 1)
        {
            dataTailBuffer = new byte[reader.BaseStream.Length - reader.BaseStream.Position];

            reader.Read(dataTailBuffer, 0, dataTailBuffer.Length);
        }
    }
}

//write the new base64string at specifid location.
using (System.IO.Stream fileStream = new FileStream(@"C:\test soap", FileMode.Open, FileAccess.Write))
{
    using (System.IO.BinaryWriter writer = new BinaryWriter(fileStream))
    {
        writer.Seek(binaryStart, SeekOrigin.Begin);

        writer.Write(base64String);//writer.Write(Convert.FromBase64String(base64String));

        if (dataTailBuffer != null)
        {
            writer.Write(dataTailBuffer, 0, dataTailBuffer.Length);
        }
    }
}

答案 2 :(得分:0)

显然,在二进制数据的位置写出base-64是行不通的,因为base-64会更长。所以问题是,你需要做什么呢?

我将推测您继承了这种可怕的二进制文件格式,并且您希望使用文本编辑器来编辑此二进制文件的文本部分。如果是这种情况,那么您可能需要更强大的二进制到文本到二进制的转换。

我建议使用base-64作为二进制部分,但文件的其余部分应该用XML或其他易于解析和解释的格式包装。 XML很好,因为它的解析器已在系统中可用。

<mydoc>
    <t>Original text</t>
    <b fieldId="1">base-64 binary</b>
    <t>Hello, world!</t>
    <b fieldId="2">928h982hr98h2984hf</b>
</mydoc>

可以从您的规范轻松创建此文件,并且可以在任何文本编辑器中轻松编辑该文件。然后可以将文件转换回原始格式。如果任何文本侵入二进制字段,则可以截断它。同样,太短的文本可以用空格填充。