我有一个包含文本数据和二进制数据的文件。这可能不是一个好主意,但我无能为力。 我知道二进制数据的结束和开始位置。
在这些位置之间读取二进制数据的最佳方法是什么,从中创建一个Base64字符串,然后将其写回原来的位置。
编辑:Base64编码的字符串与二进制数据的长度不同,因此我可能需要将Base64字符串填充为二进制数据长度。
答案 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>
可以从您的规范轻松创建此文件,并且可以在任何文本编辑器中轻松编辑该文件。然后可以将文件转换回原始格式。如果任何文本侵入二进制字段,则可以截断它。同样,太短的文本可以用空格填充。