C# utf8-кодирование bytearray вне диапазона
У меня есть следующая проблема: если String
содержит char
это не известно из ASCII
, он использует 63.
Из-за этого я изменил кодировку на UTF8
но я знаю char
может иметь length
из двух bytes
, поэтому я получаю ошибку вне диапазона.
Как я могу решить проблему?
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];
}
}
3 ответа
Проблема, с которой вы, похоже, сталкиваетесь, заключается в том, что вы знаете количество символов, но не число байтов при использовании UTF8. Чтобы решить эту проблему, вы можете использовать:
byte[] baMsec = Encoding.UTF8.GetBytes(strInput.SubString(0, 4));
byte[] baDays = Encoding.UTF8.GetBytes(strInput.SubString(4));
Рекомендуемое решение:
1) Разделить strInput
с использованием SubString(Int32, Int32)
метод и получить части даты и времени в отдельных String
переменные, скажем strDate
а также strTime
,
2) Тогда позвони UTF8Encoding.GetBytes
на strDate
а также strTime
и собрать массив байтов в baDays
а также baMsec
соответственно.
Почему это работает:
C# String
по умолчанию UTF-16
закодирован, что одинаково хорошо для представления не-ASCII символов. Следовательно, данные не теряются.
Общее предупреждение:
Никогда не пытайтесь напрямую манипулировать закодированными строками на уровне байтов, вы потеряетесь. Использовать String
а также Encoding
методы класса C#, чтобы получить байты, если вы хотите байтов.
Альтернативный подход:
Мне интересно (как и другим), почему ваши данные даты и времени содержат нечисловые символы. Я видел в комментарии, что вы получаете свои данные от reader["TIMESTAMP2"].ToString();
и образец содержимого §║ ê or l¦h
, Проверьте, интерпретируете ли вы числовые данные, хранящиеся в reader["TIMESTAMP2"]
как String
по ошибке, и вы должны рассматривать это как числовой тип. В противном случае, даже при использовании этого метода вы скоро получите неожиданный результат.
Проблема в том, что ваш baInput
может содержать больше значений, чем оба baDays
а также baMsec
может содержать. После 6 итераций у вас заканчивается размер массива. Отсюда и исключение.
Когда вы нажимаете седьмую итерацию, вы получаете i - 4
который дает 6 - 4
знак равно 2
,
поскольку baDays
имеет только два элемента, вы можете установить значения для индексов 0 и 1.