gpt4 book ai didi

c# - 读写8位以上的符号

转载 作者:行者123 更新时间:2023-11-30 16:03:24 26 4
gpt4 key购买 nike

我正在尝试编写一个编码文件。该文件有 9 到 12 位符号。在写入文件时,我猜它没有正确写入 9 位符号,因为我无法解码该文件。尽管文件中只有 8 位符号。一切正常。这是我写文件的方式

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 数组。并像这里一样写入文件。但它适用于 AZTEC_DATA_8 因为 8 位符号但不适用于 AZTEC_DATA_12。

最佳答案

主要问题在这里:

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

将单个整数转换为单个字节时,您基本上会丢弃部分结果。


如果在调用 encode() 后查看数组,您会发现某些数组元素的值高于 255,因此它们不能表示为字节。但是,在上面引用的代码中,您将整数数组中的每个元素都转换为字节,并在元素的值大于 255 时更改该元素。

因此要存储 encode() 的结果,您必须以不丢失或修改值的方式将整数数组转换为字节数组。

为了在字节数组和整数数组之间进行这种转换,可以使用函数Buffer.BlockCopy()。 .关于如何使用此功能的示例是 in this answer .

使用答案中的样本和注释中的样本进行两种转换:将字节数组转换为整数数组以传递给 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.WriteAllBytes()/File.ReadAllBytes() 将字节数组直接存储/读取到文件中,要么使用 Convert.ToBase64 ()Convert.FromBase64() 处理字节数组的 ba​​se64 编码字符串表示。


这里结合了一些示例代码:

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

关于c# - 读写8位以上的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com