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

时间:2017-05-17 14:58:18

标签: 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 = k % 8;  //get the amount of 0's to be added in the byte with the 1
byte tmp =(byte) Math.pow(2, rest);

因此,关键指令是最后一行,如果rest = 7,则结果int为128,但是字节在java中进行了签名,因此字节变为0x80而不是0xF0。 我怎样才能在Java中实现这一目标?

如果有人知道如何实施这部分,请告诉我。

1 个答案:

答案 0 :(得分:1)

从假设你的消息由字节组成开始,填充总是作为8位的多个,也就是字节。这可确保最重要的填充位始终位于消息之后的第一个填充字节的第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;
}

这将获取消息长度并获取余数。功率为2的剩余部分(在这种情况下为64)最有效地通过简单地屏蔽(power-1),这就是代码中的0x3F来自(= 64-1)。 在计算(64 - 余数)作为初始填充长度之后再次取余数,以捕获余数为0的特殊情况,导致错误的填充长度为64字节(应该是0填充)。

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