在特定偏移处插入十六进制数据

时间:2012-08-25 11:04:27

标签: c# hex offset

我需要能够将音频数据插入现有的ac3文件中。 AC3文件非常简单,可以相互附加而不会删除标题或任何内容。我遇到的问题是,如果你想添加/覆盖/擦除一个ac3文件的块,你必须以32ms的增量进行,每32ms等于1536字节的数据。因此,当我插入一个数据块(必须是1536字节,正如我刚才所说)时,我需要找到可被1536整除的最近偏移量(如0,1536(0x600),3072(0xC00)等)。让我说我可以搞清楚。我read about在特定偏移量处更改特定字符,但我需要INSERT(不覆盖)整个1536字节数据块。在给定起始偏移量和1536字节数据块的情况下,如何在C#中执行此操作?

编辑:我要插入的数据块基本上只有32毫秒的静音,我有它的十六进制,ASCII和ANSI文本翻译。当然,我可能想要多次插入这个块来获得128ms的静音,而不是仅仅32,例如。

2 个答案:

答案 0 :(得分:0)

byte[] filbyte=File.ReadAllBytes(@"C:\abc.ac3");
byte[] tobeinserted=;//allocate in your way using encoding whatever

byte[] total=new byte[filebyte.Length+tobeinserted.Length];

for(int i=0;int j=0;i<total.Length;)
{
   if(i==1536*pos)//make pos your choice
   { 
     while(j<tobeinserted.Length) 
       total[i++]=tobeinserted[j++];
   }
   else{total[i++]=filbyte[i-j];}
}

File.WriteAllBytes(@"C:\abc.ac3",total);

答案 1 :(得分:0)

以下是帮助您完成所需操作的方法:

public static void Insert(string filepath, int insertOffset, Stream dataToInsert)
{
    var newFilePath = filepath + ".tmp";
    using (var source = File.OpenRead(filepath))
    using (var destination = File.OpenWrite(newFilePath))
    {
        CopyTo(source, destination, insertOffset);// first copy the data before insert
        dataToInsert.CopyTo(destination);// write data that needs to be inserted:
        CopyTo(source, destination, (int)(source.Length - insertOffset)); // copy remaining data
    }

    // delete old file and rename new one:
    File.Delete(filepath);
    File.Move(newFilePath, filepath);
}

private static void CopyTo(Stream source, Stream destination, int count)
{
    const int bufferSize = 32 * 1024;
    var buffer = new byte[bufferSize];

    var remaining = count;
    while (remaining > 0)
    {
        var toCopy = remaining > bufferSize ? bufferSize : remaining;
        var actualRead = source.Read(buffer, 0, toCopy);

        destination.Write(buffer, 0, actualRead);
        remaining -= actualRead;
    }
}

这是一个带有示例用法的NUnit测试:

[Test]
public void TestInsert()
{
    var originalString = "some original text";
    var insertString = "_ INSERTED TEXT _";
    var insertOffset = 8;

    var file = @"c:\someTextFile.txt";

    if (File.Exists(file))
        File.Delete(file);

    using (var originalData = new MemoryStream(Encoding.ASCII.GetBytes(originalString)))
    using (var f = File.OpenWrite(file))
        originalData.CopyTo(f);

    using (var dataToInsert = new MemoryStream(Encoding.ASCII.GetBytes(insertString)))
        Insert(file, insertOffset, dataToInsert);

    var expectedText = originalString.Insert(insertOffset, insertString);

    var actualText = File.ReadAllText(file);
    Assert.That(actualText, Is.EqualTo(expectedText));
}

请注意,我已删除了一些检查代码清晰度 - 请不要忘记检查null,文件访问权限和文件大小。例如,insertOffset可能大于文件长度 - 此处不会检查此条件。