Unusual complement of characters after recording a decoded file

I use the ZXing.Net library to encode and decode my video using RS Encoder. It works well, adding and removing parity after encoding and decoding, respectively. But when writing a decoded file, it adds "?" characters in a file in different places that were not part of the source file. I do not understand why this problem occurs when writing a file. Here is my code

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); } } } 

And here is the Hex file representation for the H.264 bit stream enter image description here

+5
source share
1 answer

The problem is that you are processing the binary format as if it were a text file with encoding. But, based on what you are doing, it seems to you that you are interested in reading some bytes, processing them (encode, decode), and then writing the bytes back to the file.

If this is what you need, use the correct reader and writer for your files, in this case BinaryReader and BinaryWriter . Using your code as a starting point is my version using the previously mentioned readers / writers. My input file and output file are like bytes read and written.

 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); } } } } } 
+2
source

Source: https://habr.com/ru/post/1246396/


All Articles