【问题标题】:C# utf8-encoding bytearray out of rangeC# utf8-encoding bytearray 超出范围
【发布时间】:2016-10-29 02:05:29
【问题描述】:

我有以下问题:如果String 包含从ASCII 未知的char,它使用63。

因此我将编码更改为UTF8,但我知道char 可以有两个length 中的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];
    }
}

【问题讨论】:

  • strInput的内容是什么?
  • 内容例如为:l¦h*
  • 看起来您使用的是字节,而不是文本。首先不要使用字符串来存储它,而是使用字节数组。您首先如何获得strInput
  • | 是字符串的一部分吗?
  • 你问错问题了。您应该问的问题(最终导致您的解决方案)是:“我的源字符串有什么字符编码?”。其他一切都只是猜测,对任何人都没有用。

标签: c# encoding bytearray utf8-decode


【解决方案1】:

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

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

【讨论】:

  • strInput 包含 §║ ê 或 l¦h*
  • @xproseal 谢谢,我在看到示例数据时编辑了我的问题。尝试找出最初用于构造该数据的编码并自己使用该编码可能是明智的。
  • 我的答案*不是问题:P
【解决方案2】:

推荐解决方案:

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

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

为什么会这样:

C# String 默认情况下是 UTF-16 编码的,这同样可以很好地表示非 ASCII 字符。因此,不会丢失任何数据。

一般注意事项:

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

替代方法:

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

【讨论】:

  • That answer 已经在几分钟前给出。
  • 我知道。它出现在我撰写答案时。我应该删除我的吗?
  • 有可能,是的。您还可以扩展您的答案以提供更多信息,即先前答案中未提供的信息。这会让你的答案脱颖而出。
  • 好的,我试试。我试图坚持简洁地给出答案。
【解决方案3】:

问题是您的baInput 可以包含比baDaysbaMsec 可以包含的更多值。 6 次迭代后,数组大小用完了。因此,例外。

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

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

【讨论】:

  • 你解释了问题,但你没有给出解决方案。
  • 这真的取决于。您最多可以读取 6 个字节,但随后会截断数据。可能 OP 需要扩展数组,以便可以读取所有字符。对于 UTF-8,这意味着将数组大小加倍。可能通过强制数据采用 ASCII 格式来完全防止这种情况发生是一种选择,因为数据似乎是时间戳。
猜你喜欢
  • 2022-06-14
  • 2012-12-24
  • 2012-04-28
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多