Разница в Base64 между C # и Java - PullRequest
4 голосов
/ 15 декабря 2011

image - это строка файла изображения.

У меня есть следующий код в C #:

Convert.ToBase64String(image);

и код в Java следующим образом: org.apache.commons.codec.binary.Base64.encodeBase64(image.getBytes())

Результат другой.

Кто-то говорит это, потому что

  • Байт Java: от -128 до 127

  • C # байт: от 0 до 255

Но как я могу это исправить? Как я могу реализовать C # Convert.ToBase64String() в Java? Мне нужен тот же результат, что и в C # с использованием Java.

Ответы [ 2 ]

6 голосов
/ 15 декабря 2011

Сначала вам нужно понять, что байт хранит 256 значений, независимо от того, подписан он или нет. Если вы хотите получить неподписанные значения из подписанного байта (что поддерживает Java), вы можете использовать & 0xFF

, например

byte[] bytes = { 0, 127, -128, -1};
for(byte b: bytes) {
  int unsigned = b & 0xFF;
  System.out.println(unsigned);
}

печать

0
127
128
255

Простой ответ: вам не нужен байт [] с такими же значениями. ;)

4 голосов
/ 15 декабря 2011

Вы base64 кодируете строку ? Что вы хотите от этого? Сначала нужно преобразовать строку в последовательность байтов, выбрав кодировку, например UTF-8 или UTF-16.

Полагаю, вам удалось использовать разные кодировки с обеих сторон. Java String.GetBytes() использует кодировку по умолчанию (вероятно, что-то вроде Latin1 в западных версиях Windows). Для C # вы не опубликовали соответствующий код.

Чтобы исправить это, выберите кодировку и используйте ее явно с обеих сторон. Я рекомендую использовать UTF-8.
На стороне Java вы должны использовать правильный метод для кодирования, так что вы не получите «модифицированный UTF-8», но, поскольку я не программист Java, я не знаю, какие методы выводят модифицированный UTF-8 , Я думаю это происходит только в том случае, если вы используете какой-то внутренний метод сериализации.

байты со знаком и без знака здесь не должны быть релевантными. Промежуточный буфер байтов будет другим, но исходная строка и строка base64 должны быть идентичны с обеих сторон.

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