C# utf8-encoding bytearray 超出范围
C# utf8-encoding bytearray out of range
我有以下问题:如果 String
包含一个 ASCII
不知道的 char
,它使用 63。
因此我将编码更改为 UTF8
,但我知道 char
可以有两个 bytes
的 length
,所以我得到了范围错误。
我该如何解决这个问题?
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
可以包含的值多于 baDays
和 baMsec
可以包含的值。 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
变量中获取日期和时间部分,比如 strDate
和 strTime
.
2) 然后在strDate
和strTime
上调用UTF8Encoding.GetBytes
,分别收集baDays
和baMsec
中的字节数组
为何有效:
C# String
默认是 UTF-16
编码,同样可以很好地表示非 ASCII 字符。因此,没有数据丢失。
一般警告:
切勿尝试在字节级直接操作编码字符串,否则您会迷失方向。如果需要字节,请使用 C# 的 String
和 Encoding
class 方法来获取字节。
替代方法:
我想知道(和其他人一样)为什么您的日期时间数据包含非数字字符。我在评论中看到您从 reader["TIMESTAMP2"].ToString();
获取数据,样本内容是 §║ ê or l¦h
。检查您是否将存储在 reader["TIMESTAMP2"]
中的数字数据错误地解释为 String
,您是否应该将其实际视为数字类型。否则,即使使用这种方法,您很快也会得到意想不到的输出。
我有以下问题:如果 String
包含一个 ASCII
不知道的 char
,它使用 63。
因此我将编码更改为 UTF8
,但我知道 char
可以有两个 bytes
的 length
,所以我得到了范围错误。
我该如何解决这个问题?
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
可以包含的值多于 baDays
和 baMsec
可以包含的值。 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
变量中获取日期和时间部分,比如 strDate
和 strTime
.
2) 然后在strDate
和strTime
上调用UTF8Encoding.GetBytes
,分别收集baDays
和baMsec
中的字节数组
为何有效:
C# String
默认是 UTF-16
编码,同样可以很好地表示非 ASCII 字符。因此,没有数据丢失。
一般警告:
切勿尝试在字节级直接操作编码字符串,否则您会迷失方向。如果需要字节,请使用 C# 的 String
和 Encoding
class 方法来获取字节。
替代方法:
我想知道(和其他人一样)为什么您的日期时间数据包含非数字字符。我在评论中看到您从 reader["TIMESTAMP2"].ToString();
获取数据,样本内容是 §║ ê or l¦h
。检查您是否将存储在 reader["TIMESTAMP2"]
中的数字数据错误地解释为 String
,您是否应该将其实际视为数字类型。否则,即使使用这种方法,您很快也会得到意想不到的输出。