Вопрос по android, string – Android-байтовый массив в строку в байтовый массив

2

Все, что мне нужно, это конвертировать byte [] в String. Затем сделайте что-нибудь с этой строкой и преобразуйте обратно в массив byte []. Но в этом тестировании я просто конвертирую byte [] в строку и преобразую обратно в byte [], и результат будет другим.

преобразовать byte [] в строку, используя это:

byte[] byteEntity = EntityUtils.toByteArray(entity);
String s = new String(byteEntity,"UTF-8");

Тогда я попробовал:

byte[] byteTest = s.getBytes("UTF-8");

Тогда я пожаловался на это:

if (byteEntity.equals(byteTest) Log.i("test","equal");
else Log.i("test","diff");

Так что результат другой.

Я искал в stackoverflow об этом, но он не соответствует моему случаю. Дело в том, что мои данные - это изображение .png, поэтому преобразованная строка не читается. Заранее спасибо.

вы используетеArray.equals который не делает то, что вы думаете, он делает. Вы пытались преобразовать обратно вStrings и сравнивая эти значения? David O'Meara
Можете ли вы уточнить, почему вы это делаете? Если быть точным, что вы делаете с нечитаемой строкой? Изображения лучше хранить в виде строк в кодировке base64, если это то, что вы пытаетесь сделать). josephus
Я имею в виду, что у меня есть изображение, которое зашифровано на сервере, и когда я получаю это изображение с помощьюresponse = httppost.execute() - & GT;entity = response.getEntity - & GT;byte[] byteEntity = EntityUtils.toByteArray(entity) затем я должен преобразовать этот byte [] в строку, затем xor с ключом для дешифрования (на самом деле я пытался сделать дешифрование, которое не конвертируется в строку, но, к сожалению, это не работает.) после этого мне пришлось преобразовать его в byte [] еще раз, чтобы сделать его как ByteArrayOutputStream, если у вас есть идеи по поводу лучшего метода, очень ценю. majorl3oat

Ваш Ответ

3   ответа
0

ть метод .equals), но они не реализуют контракт равенства (hashCode и equals), необходимый для сравнения. Вы также не можете использовать ==, так как согласно документации, .getBytes вернет новый экземпляр byte []. Вы должны использовать Arrays.equals (byteEntity, byteTest) для проверки равенства.

Error: User Rate Limit ExceededArrays.equals(byteEntity, byteTest)Error: User Rate Limit Exceeded majorl3oat
1

Используя что-то вроде этого.

byte[] mByteEntity = EntityUtils.toByteArray(entity);
byte[] mByteDecrypted = clip_xor(mByteEntity,"your_key".getBytes());
baos.write(mByteDecrypted);
InputStream in = new ByteArrayInputStream(baos.toByteArray());

и это функция clip_xor

protected byte[] clip_xor(byte[] data, byte[] key) {
    int num_key = key.length;
    int num_data = data.length;

    try {
        if (num_key > 0) {
            for (int i = 0, j = 0; i < num_data; i++, j = (j + 1)
                    % num_key) {
                data[i] ^= key[j];
            }
        }
    } catch (Exception ex) {
        Log.i("error", ex.toString());
    }
    return data;
}

Надеюсь, что это будет полезно для кого-то сталкиваются с той же проблемой. Спасибо вам всем за помощь в решении этой проблемы.

Особая благодарность за P 'krit_s

0

Посмотрите на ответВот.

В этом случае моей целью было преобразование изображения png в поток байтов для отображения во встроенном браузере (это был конкретный случай, когда браузер не отображал непосредственно png).

Вы можете использовать логику этого решения для преобразования png в байт, а затем в строку.

Затем измените порядок операций, чтобы вернуться к исходному файлу.

Error: User Rate Limit Exceededchar[] base64_1 = MyUtilClass.Base64.encode(byt_1);Error: User Rate Limit ExceededMyUtilClassError: User Rate Limit ExceededBase64Error: User Rate Limit ExceededBase64.encodeError: User Rate Limit ExceededBase64.encodeBytes(byte[] source)Error: User Rate Limit Exceeded majorl3oat
Error: User Rate Limit Exceeded majorl3oat
Error: User Rate Limit Exceeded

Похожие вопросы