如何创建20个固定长度的随机字节

时间:2013-11-23 18:53:18

标签: java byte bit

我使用random.nextBytes()方法生成随机bytes。但我希望每个byte都有一个8位的固定长度。我该怎么做?

    SecureRandom random=new SecureRandom(); 
    byte[] data=new byte[2];
    random.nextBytes(data);

    System.out.println(Integer.toBinaryString(data[0]));
    System.out.println(Integer.toBinaryString(data[1]));

这是我得到的输出

    1000
    110010

由于

3 个答案:

答案 0 :(得分:3)

数组中的字节已经是8位的固定长度。如果你真正想要的是你想用8位固定长度打印它们,你可以这样做:

System.out.println(String.format("%8s", Integer.toBinaryString(data[0] & 0xFF)).replace(' ', '0'));
System.out.println(String.format("%8s", Integer.toBinaryString(data[1] & 0xFF)).replace(' ', '0'));

将打印

00001000
00110010

其他建议无法正常使用值> 128(或< 0)除非你正确添加512和掩码,否则实际上更好:

System.out.println(Integer.toBinaryString((0x100|0xff&data[1]).substring(1))

我正在添加最后一部分,因为它是我见过的最好的,所以归功于Hot Licks。它适用于Integer.toBinaryString()接受的所有类型。

Integer.toBinaryString(0x300+b).substring(2) //for b < 256

如果你想要一个16位的结果,你可以这样做:

Integer.toBinaryString(0x30000+bb).substring(2)  //for bb < 65536

对于n <1>通用1到62位。 2 ^ 62:

int bits = 8;
Long mask =  (1L << bits) - 1;
Long.toBinaryString((3L << bits) + (mask & n)).substring(2);

63位是一种特殊情况:

Long.toBinaryString((1L << bits) + (mask & n)).substring(1);

答案 1 :(得分:1)

稍微简单一些:Integer.toBinaryString(768+b).substring(2)

答案 2 :(得分:0)

我猜这是二进制和十进制之间的差异。通常,我们认为字节按照定义具有8位。然而,普通的8位数字必须以非零数字开头(除非它是商业号码,如ISBN),8位字节可以从0开始。

所以看起来你想要最重要的一点是1 - 我想。

有一种简单的方法来修复&#34;那:number | 128。并且它不应该损害随机性。