Как правильно получить GetBytes из строки? - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть строковая переменная, из которой я получаю следующие байты со следующим циклом:

Bytes I get: 1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

With that loop:

  byte[] temp = new byte[source.Length];
  string x = "";
  for (int i = 0;i != source.Length;i++)
  {
    temp[i] = ((byte) source[i]);
  }

Теперь я хотел упростить эту операцию и использовать кодирование GetBytes. Проблема в том, что я не могу подобрать подходящую кодировку. например Я получаю несколько байт неверно:

Encoding.ASCII.GetBytes(source):    1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f
Encoding.Default.GetBytes(source):  1e 05 55 3c  e2  3f 6f 03  3f 1a 1d  f4 51 6a 5e 3a  ce  4e 04  3f

Как мне избавиться от этого цикла и использовать GetBytes в Encoding?

Вот резюме:

Loop(correct bytes):                1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

Encoding.ASCII.GetBytes(source):    1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f
Encoding.Default.GetBytes(source):  1e 05 55 3c  e2  3f 6f 03  3f 1a 1d  f4 51 6a 5e 3a  ce  4e 04  3f

Спасибо!

Дополнительно:

У меня есть строковый ввод в шестнадцатеричном формате, например: "B1807869C20CC1788018690341" затем я передаю это в строку с помощью метода:

private static string hexToString(string sText)
{
  int i = 0;
  string plain = "";
  while (i < sText.Length)
  {
    plain += Convert.ToChar(Convert.ToInt32(sText.Substring(i, 2), 16));
    i += 2;
  }
  return plain;
}

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Ваша hexToString передает байтовые значения (через шестнадцатеричный код) напрямую в кодовые точки Unicode в диапазоне 0-255.Так получилось, что это связано с кодовой страницей 28591, поэтому, если вы используете:

Encoding enc = Encoding.GetEncoding(28591);

и используете , что enc, вы должны получить правильные данные;однако, более важным моментом здесь является то, что двоичные данные не совпадают с текстовыми данными, и вы не должны использовать string для хранения произвольных двоичных файлов.

2 голосов
/ 01 декабря 2011

Предполагается, что вы пытаетесь "декодировать" строковый литерал:
C # сохраняет строки как Unicode для внутреннего использования.Поэтому вы можете использовать кодировку, которая (правильно) поддерживает Unicode

, например:

Encoding.UTF8.GetBytes(source)
Encoding.UnicodeEncoding.GetBytes(source)

Обратите внимание на предостережение, данное для Encoding.Default в MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...