【问题标题】:Unusual Character addition after writing back decoded file写回解码文件后添加异常字符
【发布时间】:2016-04-04 09:51:19
【问题描述】:

我正在使用 ZXing.Net 库使用 RS 编码器对我的视频文件进行编码和解码。通过分别在编码和解码后添加和删除奇偶校验,它可以很好地工作。但是当写回解码文件时,它会添加“?”文件中不同位置的字符,这些字符不是原始文件的一部分。我不明白为什么在写回文件时会出现这个问题。 这是我的代码

using ZXing.Common.ReedSolomon;

namespace zxingtest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            string inputFileName = @"D:\JM\bin\baseline_30.264";
            string outputFileName = @"D:\JM\bin\baseline_encoded.264";
            string Content = File.ReadAllText(inputFileName, ASCIIEncoding.Default);
            //File.WriteAllText(outputFileName, Content, ASCIIEncoding.Default);
            ReedSolomonEncoder enc = new ReedSolomonEncoder(GenericGF.AZTEC_DATA_12);
            ReedSolomonDecoder dec = new ReedSolomonDecoder(GenericGF.AZTEC_DATA_12);
            //string s = "1,2,4,6,1,7,4,0,0";
            //int[] array = s.Split(',').Select(str => int.Parse(str)).ToArray();
            int parity = 10;
            List<byte> toBytes = ASCIIEncoding.Default.GetBytes(Content.Substring(0, 500)).ToList();

            for (int index = 0; index < parity; index++)
            {
                toBytes.Add(0);
            }
            int[] bytesAsInts = Array.ConvertAll(toBytes.ToArray(), c => (int)c);

            enc.encode(bytesAsInts, parity);
            bytesAsInts[1] = 3;
            dec.decode(bytesAsInts, parity);
            string st = new string(Array.ConvertAll(bytesAsInts.ToArray(), z => (char)z));
            File.WriteAllText(outputFileName, st, ASCIIEncoding.Default);
        }
    }
}   

这里是 H.264 比特流的 Hex 文件视图

【问题讨论】:

    标签: c# file zxing


    【解决方案1】:

    问题在于您正在处理二进制格式,就好像它是带有编码的文本文件一样。但根据你在做什么,你似乎只对读取一些字节感兴趣,处理它们(编码,解码),然后将字节写回文件。

    如果这是您需要的,则为您的文件使用适当的读取器和写入器,在本例中为 BinaryReaderBinaryWriter。使用您的代码作为起点,这是我使用前面提到的读者/作者的版本。对于读取和写入的字节,我的输入文件和输出文件是相似的。

    string inputFileName = @"input.264";
    string outputFileName = @"output.264";
    
    ReedSolomonEncoder enc = new ReedSolomonEncoder(GenericGF.AZTEC_DATA_12);
    ReedSolomonDecoder dec = new ReedSolomonDecoder(GenericGF.AZTEC_DATA_12);
    
    const int parity = 10;
    
    // open a file as stream for reading
    using (var input = File.OpenRead(inputFileName))
    {
        const int max_ints = 256;
        int[] bytesAsInts = new int[max_ints];
        // use a binary reader
        using (var binary = new BinaryReader(input))
        {
            for (int i = 0; i < max_ints - parity; i++)
            {
                //read a single byte, store them in the array of ints
                bytesAsInts[i] = binary.ReadByte();
            }
            // parity
            for (int i = max_ints - parity; i < max_ints; i++)
            {
                bytesAsInts[i] = 0;
            }
    
            enc.encode(bytesAsInts, parity);
    
            bytesAsInts[1] = 3;
    
            dec.decode(bytesAsInts, parity);
    
            // create a stream for writing
            using(var output = File.Create(outputFileName))
            {
                // write bytes back
                using(var writer = new BinaryWriter(output))
                {
                    foreach(var value in bytesAsInts)
                    {
                        // we need to write back a byte
                        // not an int so cast it
                        writer.Write((byte)value);
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多