将C#代码转换为Java

时间:2018-07-18 11:09:33

标签: java c#

所以我试图将一段C#代码转换为Java,但是当我使用转换后的代码时却没有得到相同的输出。

我已经搜索过Google,但找不到真正的答案。我对与TransformBlock方法等效的Java最感兴趣,因为我认为这是一种会引起问题的方法。

C#代码:

public class Sha256
{
    public Sha256()
    {
        sha = new SHA256Managed();
        sha.Initialize();
    }

    public void Process(byte[] data, int length)
    {
        sha.TransformBlock(data, 0, length, data, 0);
    }

    public void Process(uint data)
    {
        var bytes = BitConverter.GetBytes(data);

        sha.TransformBlock(bytes, 0, 4, bytes, 0);
    }

    public void Process(string data)
    {
        var bytes = Encoding.UTF8.GetBytes(data);

        sha.TransformBlock(bytes, 0, bytes.Length, bytes, 0);
    }

    public void Finish(byte[] data)
    {
        sha.TransformFinalBlock(data, 0, data.Length);

        Digest = sha.Hash;
    }

    public void Finish(byte[] data, int offset, int length)
    {
        sha.TransformFinalBlock(data, offset, length);

        Digest = sha.Hash;
    }

    SHA256 sha;
    public byte[] Digest { get; private set; }
}

Java代码:

public class Sha256 {

    public byte[] digest;
    private MessageDigest sha;

    public Sha256() {
        try {
            sha = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException ex) {
            Logger.logException(ex);
        }
    }

    public void process(byte[] data, int length) {
        sha.update(data, 0, length);
    }

    public void process(int data) {
        byte[] bytes = ByteBuffer.allocate(Integer.BYTES).putInt(data).array();

        sha.update(bytes, 0, 4);
    }

    public void process(String data) {
        byte[] bytes = data.getBytes(StandardCharsets.UTF_8);

        sha.update(bytes, 0, bytes.length);
    }

    public void finish(byte[] data) {
        sha.update(data, 0, data.length);

        digest = sha.digest();
    }

    public void finish(byte[] data, int offset, int length) {
        sha.update(data, offset, length);

        digest = sha.digest();
    }

}

1 个答案:

答案 0 :(得分:1)

C#默认为小尾数AFAIK。这是最有可能的,因为它是由Microsoft开发的,而后者又使用了x86 / x64计算机,其中默认设置为little endian。

Java的ByteBuffer默认情况下使用big endian。它最初是在大端SPARC处理器上开发的。有几种交换字节顺序的方法,但是最自然的方法是使用ByteBuffer.order(),如下所示。

public void process(int data) {
    byte[] bytes = ByteBuffer.allocate(Integer.BYTES)
                             .order(ByteOrder.LITTLE_ENDIAN)
                             .putInt(data)
                             .array();

    sha.update(bytes, 0, bytes.length);
}