#c# #encoding #byte #bytearray
#c# #кодирование #байт #массивы
Вопрос:
У меня есть веб-сервис, который возвращает двоичные данные в виде строки. Используя код C #, как я могу сохранить его в массиве байтов? Это правильный путь?
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] bytes = encoding.GetBytes(inputString);
На самом деле, это не сработало. Позвольте мне объяснить это подробнее:
код веб-службы преобразует строку (содержащую данные XSLFO) в массив байтов, используя кодировку utf8. В моем ответе веб-службы я вижу только данные, похожие "PGZvOnJvb3QgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIgeG1sbnM6eGY9Imh0dHA6Ly93d3cuZWNyaW9uLmNvbS94Zi8xLjAiIHhtbG5zOm1zeHNsPSJ1c=="
. На самом деле я хотел бы иметь исходное строковое значение, которое было преобразовано в 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);