Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java整数/双精度到无符号字节_Java_Int_Byte_Unsigned_Sha256 - Fatal编程技术网

Java整数/双精度到无符号字节

Java整数/双精度到无符号字节,java,int,byte,unsigned,sha256,Java,Int,Byte,Unsigned,Sha256,现在我知道java没有无符号字节,但如果没有,我不知道如何解决这个问题。 我试图在java中实现SHA256哈希,并且正在将消息转换为512位 int l = bytes.length; //total amount of bytes in the original message int k = 0; while((l+1+k) % 512 != 448) { k++; } //k is the total amount of 0's to be padded int rest

现在我知道java没有无符号字节,但如果没有,我不知道如何解决这个问题。 我试图在java中实现SHA256哈希,并且正在将消息转换为512位

int l = bytes.length; //total amount of bytes in the original message
int k = 0;
while((l+1+k) % 512 != 448) {
        k++;
}
//k is the total amount of 0's to be padded
int rest = k % 8;  //get the amount of 0's to be added in the byte with the 1
byte tmp =(byte) Math.pow(2, rest);
因此,key指令是最后一行,如果rest=7,结果int是128,但是字节是用java签名的,因此字节变成0x80而不是0xF0。 如何在Java中实现这一点


如果有人对如何实现这一部分有想法,请让我知道。

从假设您的消息由字节组成开始,填充始终是8位的整数,也称为字节。这确保了最高有效的pad位始终位于消息后面的第一个填充字节的第7位,因此填充(如果有)总是由0x80开始,后面跟着所需数量的0x00

这可以通过非常简单的方式实现:

public static byte[] padMsg(byte[] rawMsg) {
    int rawLen = rawMsg.length;
    int padLen = (64 - (rawLen & 0x3F)) & 0x3F;
    if (padLen == 0)
        return rawMsg;
    // all extra bytes in padded msg are zeros.
    byte[] paddedMsg = Arrays.copyOf(rawMsg, rawLen + padLen);
    // ensure topmost pad bit is a one
    paddedMsg[rawLen] = (byte) 0x80;
    return paddedMsg;
}
这将获取消息长度,并获取剩余长度。二次幂的剩余部分(在本例中为64)通过简单地使用(幂-1)进行and掩蔽得到,这就是代码中0x3F的来源(=64-1)。 在计算(64-余数)作为初始填充长度后,将再次获取余数,以捕获余数为0的特殊情况,从而导致64字节的错误填充长度(应为0填充)


一旦知道以字节为单位的填充长度,就会捕获大小写padding=0。在任何其他情况下,消息长度都会增加(0x00字节,Arrays.copyOf会自动增加)。然后将第一个填充字节替换为0x80,并返回现在保证长度为64字节倍数的填充消息。

为什么128会是
0xF0
?对,
rest
应该是0到7之间的数字,它们都是正数,并且适合
字节的范围。我想你可能还有另一个问题。只是记录在案:这是为了学习?您知道,在现实世界中,实现您自己的加密很可能是一个非常糟糕的主意?顺便说一句,您最好执行
1“Java没有无符号字节”并没有直接错误,但它通常没有抓住要点。有符号字节中仍然有8位,您可以(小心地)将它们视为无符号字节<代码>(字节)128
仍然是正确的结果,即使它在调试器中看起来像-128。不管怎样都是0x80。