为了账号安全,请及时绑定邮箱和手机立即绑定

将 C# 代码转换为 Java

将 C# 代码转换为 Java

繁华开满天机 2021-05-31 08:54:22
所以我尝试将一段 C# 代码转换为 Java,但是当我使用转换后的代码时,我没有得到相同的输出。我已经在谷歌上搜索过,并没有真正找到答案。我对 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; }}爪哇代码: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 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

默认情况下,C# 是小端的 AFAIK。这很可能是因为它是由 Microsoft 开发的,而 Microsoft 又使用 x86/x64 机器,其中默认为 little endian。


Java 的 ByteBuffer 默认使用大端。它最初是在大端的 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);

}


查看完整回答
反对 回复 2021-06-02
  • 1 回答
  • 0 关注
  • 414 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信