Как я могу преобразовать свой короткий код С# в java

Я пытаюсь преобразовать следующий код С# в java, чтобы добавить его в свое новое приложение. Ниже приведен короткий код C#, а JAVA — это то, что мне удалось подобрать, но я уверен, что не сделал идентичное преобразование, поскольку вывод JAVA отличается от вывода C#. Какие изменения в JAVA необходимы, чтобы сделать его идентичным C#?

    private static string GetMd5Sum(string productIdentifier)
    {
        var enc = Encoding.Unicode.GetEncoder();
        var unicodeText = new byte[productIdentifier.Length * 2];
        enc.GetBytes(productIdentifier.ToCharArray(), 0, productIdentifier.Length, unicodeText, 0, true);
        MD5 md5 = new MD5CryptoServiceProvider();
        var result = md5.ComputeHash(unicodeText);   
        var sb = new StringBuilder();
        for (var i = 0; i < result.Length; i++)
        {
            sb.Append(result[i].ToString("X2"));
        }
        return sb.ToString();
    }

Я пробовал следующее:

package myTest; 
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Licensing {
    private static String GetMd5Sum(String productIdentifier)
    {
        byte[] unicodeText = new byte[productIdentifier.length() * 2];
        byte[] bt = productIdentifier.getBytes();
        int bb=0;
        for(int b = 0; b < bt.length; b++ ) {
            unicodeText[bb] = bt[b];
            bb++;
            unicodeText[bb] = 0;
            bb++;
        }
   
        String s = unicodeText.toString();
        byte[] md5Hash = getMd5(s).getBytes();
        return bytesToHex(md5Hash);
    }
       
    final protected static char[] decimalArray = "0123456789".toCharArray();
    public static String bytesToDecimal(byte[] bytes) {
        char[] decimalChars = new char[bytes.length * 4];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            decimalChars[j * 4] = decimalArray[v / 100];
            decimalChars[j * 4 + 1] = decimalArray[(v / 10) % 10];
            decimalChars[j * 4 + 2] = decimalArray[v % 10];
            decimalChars[j * 4 + 3] = ' ';
        }
        return new String(decimalChars);
    }
    
    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }
       
    private static String getMd5(String input) {
        try {

            // Static getInstance method is called with hashing MD5
            MessageDigest md = MessageDigest.getInstance("MD5");

            // digest() method is called to calculate message digest
            // of an input digest() return array of byte
            byte[] messageDigest = md.digest(input.getBytes());

            // Convert byte array into signum representation
            BigInteger no = new BigInteger(1, messageDigest);

            // Convert message digest into hex value
            String hashtext = no.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }

        // For specifying wrong message digest algorithms
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

}

Вы уверены, что хотите использовать UTF16 в C#, а не UTF8?

DiplomacyNotWar 07.04.2022 08:51

Код C#, который я использовал для создания кода для моего плагина C#. Я намерен создать приложение для Android для генерации этих ключей, и результат должен быть идентичен выходу С#. Если это может быть достигнуто с помощью UTF8, тогда все в порядке. Я не могу изменить код C#, если он дал другой результат.

dandan21 07.04.2022 09:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно дать тот же результат:

import java.security.*;
import java.io.*;
import java.math.*;

private static String GetMd5Sum(String productIdentifier) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    byte[] bytesOfMessage = productIdentifier.getBytes("UTF-16LE");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] digest = md.digest(bytesOfMessage);
    BigInteger i = new BigInteger(1, digest);
    return String.format("%1$032X", i);
}

Этот ответ основан на этот ответ, но изменен на использование UTF-16LE, чтобы соответствовать C# Encoding.Unicode.

Другие вопросы по теме