Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#到Android/java的端口sha-1哈希_Java_C#_Android_Sha1 - Fatal编程技术网

从C#到Android/java的端口sha-1哈希

从C#到Android/java的端口sha-1哈希,java,c#,android,sha1,Java,C#,Android,Sha1,我需要从C移植以下代码# 到Android应用程序。我有一个Java版本: private static String hashCode(String userCode) { String hashSha1; MessageDigest digest = null; try { digest = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException e) {

我需要从C移植以下代码#

到Android应用程序。我有一个Java版本:

private static String hashCode(String userCode) {
    String hashSha1;
    MessageDigest digest = null;
    try {
        digest = MessageDigest.getInstance("SHA-1");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    digest.reset();
    byte[] data = digest.digest(userCode.getBytes());
    return Base64.encodeToString(data, Base64.DEFAULT);
}
唉,这段代码不会产生相同的结果。找出原因是一场白费力气的追逐

在Android中我可以做些什么来获得相同的哈希值?

这是将
userCode
字符串转换为字节的C代码:

byte[] bytes = Encoding.Unicode.GetBytes(code);
Java代码只是:

userCode.getBytes()
这意味着在Java中,您使用的是平台默认编码,即Android上的UTF-8。您应该为指定等效的编码,即

您几乎不应该调用
String(byte[])
String.getBytes()
,两者都使用平台默认编码。始终指定要使用的编码

更一般地说,您说过“找出原因是一场白费力气的追逐”——但在这种情况下,解决方案几乎总是一次详细记录转换的一个步骤。这里有三个转换:

  • 字符串
    字节[]
    (将
    用户代码
    编码为二进制数据)
  • MD5哈希(
    字节[]
    字节[]
  • 将哈希编码为base64
如果您单独执行了这些步骤,并记录了结果,您就会发现问题出在第一步。

这是将
userCode
字符串转换为字节的C代码:

byte[] bytes = Encoding.Unicode.GetBytes(code);
Java代码只是:

userCode.getBytes()
这意味着在Java中,您使用的是平台默认编码,即Android上的UTF-8。您应该为指定等效的编码,即

您几乎不应该调用
String(byte[])
String.getBytes()
,两者都使用平台默认编码。始终指定要使用的编码

更一般地说,您说过“找出原因是一场白费力气的追逐”——但在这种情况下,解决方案几乎总是一次详细记录转换的一个步骤。这里有三个转换:

  • 字符串
    字节[]
    (将
    用户代码
    编码为二进制数据)
  • MD5哈希(
    字节[]
    字节[]
  • 将哈希编码为base64

如果您单独执行了这些步骤,并记录了结果,您就会发现问题出在第一步。

Android将UTF-8作为默认字符集。尝试改用。

Android将UTF-8作为默认字符集。尝试改用。

为什么需要再次生成哈希?嗯?如果您不想再次生成散列,散列的意义何在?我只需要移植这段代码。代码生成哈希。为什么需要再次生成哈希?嗯?如果您不想再次生成散列,散列的意义何在?我只需要移植这段代码。代码生成散列。最好将
UTF_16LE
指定为显式的endianness。最好将
UTF_16LE
指定为显式的endianness。