2

您好,我正在使用下面的代码来加密字符串。我发现 MD5 make 在 -127 - +128 值下工作。

我得到了减去的价值。

public static void main(String[] args) throws Exception {
        String message = "smile";

        encrypt("Jack the Bear");
    }

    public static void encrypt(String password) throws Exception {

      byte byteData[] =null;

     MessageDigest md = null;
       try {
         md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes("US-ASCII"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      byteData = md.digest();
      System.out.println(Arrays.toString(byteData));


    }

我的输出:[101、23、66、106、91、-51、6、119、-13、23、-101、108、-122、27、20、-124]

实际输出:[101、23、66、106、91、205、6、119、243、23、155、108、134、27、20、132]

4

2 回答 2

3

这是因为byteJava 中的类型(与几乎所有其他类型一样)是有符号的,这意味着它的范围为-128..127.

如果要将此范围转换为无符号范围 ( 0..255),请执行以下操作:

byte b = -2;
int i = b & 0xff;

像这样打印你的结果byteData

for (byte b : byteData)
    System.out.print((b & 0xff) + " ");

如果要以十六进制格式打印结果:

for (byte b : byteData)
    System.out.printf("%02x ", b);
于 2015-05-11T07:10:46.603 回答
1

您的摘要计算正确,负字节值没有任何问题。

Java 中的字节类型范围从 -128 到 +127,这可能有点令人惊讶 - 许多人认为字节是无符号的,但 Java 没有无符号数字类型。

于 2015-05-11T07:11:12.920 回答