主な問題はここにある:
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);