C# 读取和写入8位以上的符号
我正在尝试编写一个编码文件。该文件有9到12位符号。当我写一个文件时,我猜它没有正确地写9位符号,因为我无法解码该文件。尽管文件中只有8位符号。一切正常。这就是我写文件的方式C# 读取和写入8位以上的符号,c#,file,filestream,zxing,symbols,C#,File,Filestream,Zxing,Symbols,我正在尝试编写一个编码文件。该文件有9到12位符号。当我写一个文件时,我猜它没有正确地写9位符号,因为我无法解码该文件。尽管文件中只有8位符号。一切正常。这就是我写文件的方式 File.AppendAllText(outputFileName, WriteBackContent, ASCIIEncoding.Default); 使用ReadAllText函数调用进行读取也是如此。 这里怎么走? 我正在使用ZXing库使用RS编码器对我的文件进行编码 ReedSolomonEncode
File.AppendAllText(outputFileName, WriteBackContent, ASCIIEncoding.Default);
使用ReadAllText
函数调用进行读取也是如此。
这里怎么走?
我正在使用ZXing库使用RS编码器对我的文件进行编码
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);
byte[] bytes = bytesAsInts.Select(x => (byte)x).ToArray();
string contentWithParity = (ASCIIEncoding.Default.GetString(bytes.ToArray()));
WriteBackContent += contentWithParity;
File.AppendAllText(outputFileName, WriteBackContent, ASCIIEncoding.Default);
就像在代码中一样,我正在用AZTEC_DATA_12初始化编码器,这意味着12位符号。因为RS编码器需要int数组,所以我将其转换为int数组。并像这里一样写入文件。但它可以与8位符号的AZTEC_数据_8信标一起工作,但与AZTEC_数据_12不一起工作。主要问题在于:
byte[] bytes = bytesAsInts.Select(x => (byte)x).ToArray();
在将单个整数转换为单个字节时,基本上会丢弃部分结果
如果在调用
encode()
之后查看数组,可以看到一些数组元素的值大于255,因此它们不能表示为字节。但是,在上面引用的代码中,您将整数数组中的每个元素强制转换为字节,并在其值大于255时更改元素
因此,要存储encode()
的结果,必须将整数数组转换为字节数组,以确保值不会丢失或修改
为了在字节数组和整数数组之间进行这种转换,可以使用函数。有关如何使用此函数的示例如下
将答案中的示例和注释中的示例用于两种转换:将字节数组转换为整数数组以传递给encode()函数,并将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.writealBytes()
/file.ReadAllBytes()
将字节数组直接存储/读取到文件中,或者使用Convert.ToBase64()
和Convert.FromBase64()
使用字节数组的base64编码字符串表示
下面是一些示例代码:
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);