Base64 Android to String and get Hash md5

есть bitmap который через этот метод

public static String convert(Bitmap bitmap)
{
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
    return Base64.encodeToString(outputStream.toByteArray(), Base64.URL_SAFE );
}

должен вернуть base64 и сунуть его в json, потом из base64 получить md5 и снова положить в json, основной код:

String fileName = selectedImage.getLastPathSegment();
            String base64 = ImageUtil.convert(bitmap);
            String hash = ImageUtil.md5(base64);
            Log.e(TAG, fileName);
            Log.e(TAG, base64);
            Log.e(TAG, hash);
            UserImage userImage = new UserImage(fileName, base64, hash);

метод получения md5

public static String md5(String s) {
    try {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        digest.update(s.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i=0; i<messageDigest.length; i++)
            hexString.append(Integer.toHexString(0xFF & messageDigest[i]));

        return hexString.toString();
    }catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

ответ от сервера:

Hash validation error. Expected: ab6d68e277fbd8a7621fbd7ca8d168, actual: 8dbfc0c5479f862387e0327f19837deb{json...

Ответы (1 шт):

Автор решения: woesss

Скорее всего сервер хочет хеш оригинального изображения, а не закодированного в Base64. Тогда сделаем так:

ImageUtil:

public static byte[] compress(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
    return outputStream.toByteArray();
}

public static String convert(byte[] imageBytes) {
    return Base64.encodeToString(imageBytes, Base64.URL_SAFE );
}

public static String md5(byte[] srcBytes) {
    try {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        digest.update(srcBytes);
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i=0; i<messageDigest.length; i++) {
            String hb = Integer.toHexString(0xFF & messageDigest[i]);
            if (hb.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hb);
        }

        return hexString.toString();
    }catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

Используем:

String fileName = selectedImage.getLastPathSegment();
byte[] imageBytes = ImageUtil.compress(bitmap);
String base64 = ImageUtil.convert(imageBytes);
String hash = ImageUtil.md5(imageBytes);
Log.e(TAG, fileName);
Log.e(TAG, base64);
Log.e(TAG, hash);
UserImage userImage = new UserImage(fileName, base64, hash);

P.S. за правильность формирования строки md5 не ручаюсь - мог ошибиться

→ Ссылка