所以我尝试将一段 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);
}
添加回答
举报
0/150
提交
取消