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.

Другие вопросы по тегам