C# utf8-encoding bytearray 超出范围

C# utf8-encoding bytearray out of range

我有以下问题:如果 String 包含一个 ASCII 不知道的 char,它使用 63。

因此我将编码更改为 UTF8,但我知道 char 可以有两个 byteslength,所以我得到了范围错误。
我该如何解决这个问题?

System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

byte[] baInput = enc.GetBytes(strInput);

// Split byte array (6 Byte) in date (days) and time (ms) parts
byte[] baMsec = new byte[4];
byte[] baDays = new byte[2];

for (int i = 0; i < baInput.Length; i++)
{
    if (4 > i)
    {
        baMsec[i] = baInput[i];
    }
    else
    {
        baDays[i - 4] = baInput[i];
    }
}

问题是您的 baInput 可以包含的值多于 baDaysbaMsec 可以包含的值。 6 次迭代后,您 运行 超出了数组大小。因此,例外。

当您进行第七次迭代时,您会得到 i - 4,这会产生 6 - 4 = 2

由于baDays只有两项,您可以设置索引0和1的值。

似乎遇到的问题是在使用 UTF8 时您知道字符数,但不知道字节数。要解决这个问题,您可以使用:

byte[] baMsec = Encoding.UTF8.GetBytes(strInput.SubString(0, 4));
byte[] baDays = Encoding.UTF8.GetBytes(strInput.SubString(4));

推荐方案:

1) 使用 SubString(Int32, Int32) 方法拆分 strInput 并在单独的 String 变量中获取日期和时间部分,比如 strDatestrTime .

2) 然后在strDatestrTime上调用UTF8Encoding.GetBytes,分别收集baDaysbaMsec中的字节数组

为何有效:

C# String 默认是 UTF-16 编码,同样可以很好地表示非 ASCII 字符。因此,没有数据丢失。

一般警告:

切勿尝试在字节级直接操作编码字符串,否则您会迷失方向。如果需要字节,请使用 C# 的 StringEncoding class 方法来获取字节。

替代方法:

我想知道(和其他人一样)为什么您的日期时间数据包含非数字字符。我在评论中看到您从 reader["TIMESTAMP2"].ToString(); 获取数据,样本内容是 §║ ê or l¦h。检查您是否将存储在 reader["TIMESTAMP2"] 中的数字数据错误地解释为 String,您是否应该将其实际视为数字类型。否则,即使使用这种方法,您很快也会得到意想不到的输出。