所以我试图将一段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();
}
}
答案 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);
}