2016-04-04 2 views
5

私は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ファイル図である enter image description here

答えて

2

問題は、それが持つテキストファイルであるかのようにあなたがバイナリ形式を処理しているということですエンコーディングしかし、何をしているのかに基づいて、いくつかのバイトを読み込み、処理(エンコード、デコード)した後、バイトをファイルに書き戻すだけに興味があるようです。

これが必要な場合は、ファイルに適切なリーダーとライター(この場合はBinaryReaderBinaryWriter)を使用してください。あなたのコードを出発点として使用して、これは前述のリーダ/ライターを使用した私のバージョンです。私のinputfileとoutputfileは、読み書きされたバイトの場合と似ています。

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); 
       } 
      } 
     } 
    } 
} 
関連する問題