有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将字节数组转换为大整数:为什么数组输出中有这么多“f”十六进制值?

我试图将我的摘要的BigInteger版本与实际摘要字节进行比较,以查看在BigInteger转换过程中是否丢失了任何数据。我发现它在输出中有所有相同的十六进制值,除了字节数组输出中有许多f之外,但biginger输出没有。为什么呢

控制台输出

a7b7e9592daa0896db0517bf8ad53e56b1246923

ffffffa7
ffffffb7
ffffffe9
59
2d
ffffffaa
8
ffffff96
ffffffdb
5
17
ffffffbf
ffffff8a
ffffffd5
3e
56
ffffffb1
24
69
23

代码

import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class Project2
{
    public static void main(String[] args)
    {
        try
        {
            ByteBuffer buffer = ByteBuffer.allocate(4);
            buffer.putInt(0xAABBCCDD); //Test value
            byte[] digest = MessageDigest.getInstance("SHA-1").digest(buffer.array());
            BigInteger bi = new BigInteger(1, digest);

            //Big Integer output:
            System.out.println(bi.toString(16));
            System.out.println("");

            //Byte array output:
            for(byte b : digest)
            {
                System.out.println(Integer.toHexString(b));
            }
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    字节是有符号的,所以在转换为int(对于Integer.toHexString)时,它们是符号扩展的。因此,任何负字节都将成为一个负整数,它具有高阶位1(2的补码)。使用

    System.out.println(Integer.toHexString(b & 0xFF));
    

    屏蔽符号扩展位,只保留底部8位