2016-04-05 7 views
3

エンコードされたファイルを書き込もうとしています。ファイルには9〜12ビットのシンボルがあります。私はそのファイルを解読することができないので、私はそれが正しく9ビットのシンボルが書かれていないと思うファイルを書いている間。ファイルには8ビットのシンボルしか含まれていませんが。すべてうまく動作します。これは私が同じ8ビット以上のシンボルを読み書きする

File.AppendAllText(outputFileName, WriteBackContent, ASCIIEncoding.Default); 

ReadAllText関数呼び出しで読み込むために行くファイルを書いています方法です。
ここに行く方法は何ですか?


私はRSエンコーダを使用して、私のファイルをエンコードするためにZXingライブラリを使用しています。

コードのように、エンコーダをAZTEC_DATA_12で初期化しています。これは12ビットシンボルを意味します。 RSエンコーダはint配列を必要とするので、int配列に変換します。そして、ここに書いてみましょう。しかし、それは8ビットシンボルのAZTEC_DATA_8ビートでうまく動作しますが、AZTEC_DATA_12ではうまく動作しません。

答えて

3

主な問題はここにある:

byte[] bytes = bytesAsInts.Select(x => (byte)x).ToArray(); 

単一バイトに単一の整数に変換するときは、基本的には、結果の一部を捨てています。


あなたはencode()を呼び出した後、アレイを見れば、あなたは彼らがバイトとして表すことができないので、配列の要素のいくつかは、255よりも高い値を持っていることがわかります。しかし、上記で引用したコードでは、整数配列のすべての要素をbyteにキャストし、255より大きい値を持つ要素を変更します。

encode()の結果を格納するには、整数値が失われたり変更されたりしないように配列をバイト配列に変換します。

このようなバイト配列と整数配列の変換を行うには、関数Buffer.BlockCopy()を使用できます。この関数の使用方法の例はin this answerです。

両方の変換の答えとコメントからのサンプルを使用します。バイト配列を整数配列に変換してencode()関数に渡し、エンコードから返された整数配列を返します)関数をバイト配列に戻します。

ここでリンク解答からのサンプルコードは、次のとおりです。


// Convert byte array to integer array 
byte[] result = new byte[intArray.Length * sizeof(int)]; 
Buffer.BlockCopy(intArray, 0, result, 0, result.Length); 

// Convert integer array to byte array (with bugs fixed) 
int bytesCount = byteArray.Length; 
int intsCount = bytesCount/sizeof(int); 
if (bytesCount % sizeof(int) != 0) intsCount++; 
int[] result = new int[intsCount];    
Buffer.BlockCopy(byteArray, 0, result, 0, byteArray.Length); 
今のファイルにデータを格納について: Encoding.GetString()経由で直接文字列にデータを入れないでください。すべてのビットシーケンスが、任意の文字セット内の文字の有効な表現であるわけではありません。だから、ランダムな乱数列を文字列に変換すると失敗することがあります。

代わりに、いずれかの店舗/ File.WriteAllBytes()/File.ReadAllBytes()を介してファイルに直接バイト配列を読み取りまたはバイト配列のBASE64符号化された文字列表現で動作するようにConvert.ToBase64()Convert.FromBase64()を使用します。ここ組み合わせ


いくつかのサンプルコードです:

ReedSolomonEncoder enc = new ReedSolomonEncoder(GenericGF.AZTEC_DATA_12);//if i use AZTEC_DATA_8 it works fine beacuse symbol size is 8 bit 
    int[] bytesAsInts = Array.ConvertAll(toBytes.ToArray(), c => (int)c); 
    enc.encode(bytesAsInts, parity); 

    // Turn int array to byte array without loosing value 
    byte[] bytes = new byte[bytesAsInts.Length * sizeof(int)]; 
    Buffer.BlockCopy(bytesAsInts, 0, bytes, 0, bytes.Length); 

    // Write to file 
    File.WriteAllBytes(outputFileName, bytes); 

    // Read from file 
    bytes = File.ReadAllBytes(outputFileName);    

    // Turn byte array to int array 
    int bytesCount = bytes.Length * 40; 
    int intsCount = bytesCount/sizeof(int); 
    if (bytesCount % sizeof(int) != 0) intsCount++; 
    int[] dataAsInts = new int[intsCount]; 
    Buffer.BlockCopy(bytes, 0, dataAsInts, 0, bytes.Length); 

    // Decoding 
    ReedSolomonDecoder dec = new ReedSolomonDecoder(GenericGF.AZTEC_DATA_12); 
    dec.decode(dataAsInts, parity); 
関連する問題