Сохранение строки двоичных данных в массив байтов с помощью c#

#c# #encoding #byte #bytearray

#c# #кодирование #байт #массивы

Вопрос:

У меня есть веб-сервис, который возвращает двоичные данные в виде строки. Используя код C #, как я могу сохранить его в массиве байтов? Это правильный путь?

 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] bytes = encoding.GetBytes(inputString);
  

На самом деле, это не сработало. Позвольте мне объяснить это подробнее:
код веб-службы преобразует строку (содержащую данные XSLFO) в массив байтов, используя кодировку utf8. В моем ответе веб-службы я вижу только данные, похожие "PGZvOnJvb3QgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIgeG1sbnM­6eGY9Imh0dHA6Ly93d3cuZWNyaW9uLmNvbS94Zi8xLjAiIHhtbG5zOm1zeHNsPSJ1c==" . На самом деле я хотел бы иметь исходное строковое значение, которое было преобразовано в byte[] в службе. Не уверен, возможно ли это?

Комментарии:

1. да, опубликованный вами код верен, при условии, что данные закодированы с использованием UTF8.

2. В каком формате находятся двоичные данные? Это в Base64, UTF8 или как? Кодировка имеет значение.

3. @user465876: Вы сказали, что изначально это были двоичные данные… какого рода? Обработка (скажем) изображения в виде строки в кодировке UTF-8 — плохая идея.

Ответ №1:

Нет, это плохая идея.

Если входные данные не были изначально текстовыми, пытаться использовать Encoding — плохая идея. Веб-служба должна использовать что-то вроде base64 для ее кодирования — в этот момент вы можете использовать Convert.FromBase64String для возврата исходных двоичных данных.

В принципе, обработка произвольных двоичных данных так, как если бы это был закодированный текст, — это быстрый способ потерять данные. Когда вам нужно представить двоичные данные в виде строки, вы должны использовать base64, hex или что-то подобное.

Это может означать, что вам, конечно, также нужно изменить веб-сервис — если он создает строку, просто обрабатывая двоичные данные как текст в кодировке UTF-8, это изначально не работает.

Комментарии:

1. Джон, мой приведенный выше код не сработал. На самом деле код веб-сервиса преобразует строку (содержащую данные XSLFO) в массив байтов, используя кодировку utf8. В моем ответе веб-службы я вижу только данные, похожие «PGZvOnJvb3QgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIgeG1sbnM6eGY9Imh0dHA6Ly93d3cuZWNyaW9uLmNvbS94Zi8xLjAiIHhtbG5zOm1zeHNsPSJ1c==». На самом деле я хотел бы иметь исходное строковое значение, которое было преобразовано в byte[] в службе. Не уверен, возможно ли это?

2. @user465876: Для меня это похоже на Base64 … так что Convert.FromBase64String должно быть в порядке. Но если это была изначально строка, почему для начала она была преобразована в массив байтов?

3. Это сработало с Convert.FromBase64String. На самом деле один и тот же веб-сервис вызывается из разных мест, и в большинстве случаев клиенты работают с массивом байтов.

4. Смотрите также это сообщение в блоге Фила Хаака

Ответ №2:

Если строка закодирована в кодировке UTF8, то да, это правильный способ. Если это в Юникоде, это очень похоже:

 System.Text.Unicode encoding = new System.Text.Unicode();
byte[] bytes = encoding.GetBytes(inputString);
  

Base64Encoding немного отличается:

 byte[] bytes = Convert.FromBase64String(inputString);