写入文件时使用错误的编码C#

Aar*_*ron 2 c# character-encoding

我正在创建一个二进制文件,以传输给第三方,其中包含有关每个图像的图像和信息.该文件使用记录长度格式,因此每条记录都是特定长度.每条记录的开头是记录长度指示符,长度为4个字符,表示Big Endian格式的记录长度.

我正在使用BinaryWriter写入文件,而对于记录长度指示器,我正在使用Encoding.Default.

我遇到的问题是一条记录中有一个字符显示为"?" 因为它无法识别.我为记录长度指示器构建字符串的算法是这样的:

  private string toBigEndian(int value)
    {
        string returnValue = "";            
        string binary = Convert.ToString(value, 2).PadLeft(32, '0');
        List<int> binaryBlocks = new List<int>();
        binaryBlocks.Add(Convert.ToInt32(binary.Substring(0, 8), 2));
        binaryBlocks.Add(Convert.ToInt32(binary.Substring(8, 8), 2));
        binaryBlocks.Add(Convert.ToInt32(binary.Substring(16, 8), 2));
        binaryBlocks.Add(Convert.ToInt32(binary.Substring(24, 8), 2));

        foreach (int block in binaryBlocks)
        {                
            returnValue += (char)block;
        }

        Console.WriteLine(value);

        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

它占用记录的长度,将其转换为32位二进制,将其转换为8位二进制块,然后将每个块转换为适当的字符.此处返回的字符串确实包含正确的字符,但是当它写入文件时,一个字符无法识别.这就是我写它的方式:

//fileWriter is BinaryWriter and record is Encoding.Default
fileWriter.Write(record.GetBytes(toBigEndian(length)));
Run Code Online (Sandbox Code Playgroud)

也许我使用了错误的编码类型?我尝试过UTF-8,它应该可以工作,但它有时给我额外的字符.

在此先感谢您的帮助.

Guf*_*ffa 6

问题是您不应该将值作为字符串返回.

当您将值转换为char,然后将其编码为8位字符时,有几个值将被编码为错误的字节代码,并且几个值将无法编码(导致?字符) .在该步骤中不丢失数据的唯一方法是将其编码为UTF-16,但这将为您提供8个字节而不是4个字节.

您应该返回为字节数组,以便您可以将其写入文件而无需在字符数据和二进制数据之间来回转换.

private byte[] toBigEndian(int value) {
   byte[] result = BitConverter.GetBytes(value);
   if (BitConverter.IsLittleEndian) Array.Reverse(result);
   return result;
}

fileWriter.Write(toBigEndian(length));
Run Code Online (Sandbox Code Playgroud)