将字节数组存储到字符串时,如何防止高位8位ASCII的值发生变化?

时间:2015-11-17 21:45:16

标签: c# .net utf-8

我正在使用我需要能够发送8位ASCII的设备。我正在尝试将值大于127的字节数组保存到字符串中。这些值被转换为0xfffd而不是我期望的零前缀字符。

例如,我希望通过下面的示例,字符串中的第三个字符为0x00AA,但实际上它是0xffdd

如果我直接分配,它就有效。

test = "ABC" + (char)0xAA + "DEF";

我尝试了其他编码,例如"windows-1250",结果不同(0x201a),但不是我想要的。选择ASCII编码也失败了(0x003f)。

如何获得正确的转换?

示例代码:

  byte[] byteArray = new byte[30];

  byteArray[0] = 0x41; // A
  byteArray[1] = 0x42; // B
  byteArray[2] = 0x43; // C
  byteArray[3] = 0xAA; // Special character in upper 128 character set
  byteArray[4] = 0x44; // D
  byteArray[5] = 0x45; // E
  byteArray[6] = 0x46; // F

  string test = System.Text.Encoding.UTF8.GetString(byteArray).TrimEnd('\0');
  if (!test.Equals("ABC" + (char)0xAA + "DEF")) {
    // It fails
    // test[3] == 0xfffd not 0x00aa
  } 

1 个答案:

答案 0 :(得分:-1)

我认为我的问题是无论我使用什么“编码”,它都会尝试重新映射字符以匹配目标。手动将每个字节转换为char解决了我的问题。

用法:string test = ByteArrayToString(byteArray);

/// <summary>
/// Convert a zero terminated byte array to a string.
/// </summary>
/// <param name="byteArray"></param>
/// <returns></returns>
private static string ZeroTerminatedByteArrayToString(byte[] byteArray)
{
  // This routine is used to map a byte array unmodified to a string
  // Each character is stored with as a double byte with leading zero.
  // Using the encodings to convert will try and remap some characters
  // System.Text.Encoding.GetEncoding("437").GetString(byteArray);
  // System.Text.Encoding.UTF8.GetString(byteArray);

  string result = "";
  for (int i = 0; i < byteArray.Length; i++) {
    if (byteArray[i] == 0) { break; }
    result = result + (char)byteArray[i];
  }
  return result;
}