我正在使用我需要能够发送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
}
答案 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;
}