Java生成代码字节256 * 256&为0xFF

时间:2015-02-20 06:47:49

标签: java random hex

我需要生成一个3字节的代码(如A502F1)。我有一个标准:

  

第一个字节是(serialCodeNumber /(256 * 256))& 0xFF

     

第二是(serialCodeNumber / 256)& 0xFF

     

3是(serialCodeNumber)& 0xFF的

     

serialCodeNumber是序列1-0xFFF

这是什么意思!?

我会像这样生成它:

String codeNum = new BigInteger(256, random).toString(16).toUpperCase().substring(0, 6);

但是,正如要求所说,正确的做法是什么?

1 个答案:

答案 0 :(得分:1)

我不太确定serialCodeNumber是什么意思,因为如果它稍后除以65025,它必须是一个比0xFFF(即4095)大得多的数字任何合理的意义。

但是让我们来看看这些条件,一旦你习惯了按位AND运算符,它们都会有意义。关于它是如何工作的,here有一个很好的阅读,但我认为这个问题的重点是Markus Jarderot这句话:

  

结果是两个数字都打开的位。

因为在你的条件下你有& 0xFF和0xFF是255,或者在二进制它是11111111,所有前8位都被打开。这是一个简单的技巧,只检索任何数字的前8位。而众所周知,8位构成一个字节。 (你现在开始看到这一切现在在哪里?)

至于& 0xFF之前的条件,有些人可能会将它们识别为隐藏在分区后面的位移操作。

(serialCodeNumber / (256*256))相当于(serialCodeNumber >> 16)

(serialCodeNumber / 256)相当于(serialCodeNumber >> 8)

但在这种情况下,这并不重要。

所以第一个条件将serialCodeNumber除以65025(256 * 256),然后查看最右边的8位并忽略任何其他位,从构造一个字节的8位开始。

在Java中,您几乎可以按原样编写条件:

byte myFirstByte = (byte) ((serialCodeNumber / (256*256)) & 0xFF);

其他条件并没有太大差异:

byte mySecondByte = (byte) ((serialCodeNumber / (256)) & 0xFF);

byte myThirdByte = (byte) ((serialCodeNumber) & 0xFF);

一旦你拥有了所有三个字节,我就假设您需要将它们转换为十六进制字符串。所以我将它们添加到一个字节数组中。

byte[] myArray = {myFirstByte,mySecondByte,myThirdByte};

并借用一些方法来解释如何将字节数组转换为来自this question的HEX字符串。

String codeNum = bytesToHex(myArray);

结果将如下所示:

F03DD7

修改

由于您必须生成最多6个字节的序列号,因此我建议使用long个数字。

一个6字节的数字将是1到281474976710655,所以你可能需要随机生成一个。

首先实例化一个Random对象,您可以从中查询数字:

Random random = new Random();

完成后,从中调查long,范围为1到281474976710655。

为此,您可以从KennyTM's借用this question个答案。

所以你可以生成这样的数字:

long serialCodeNumber = nextLong(random, 281474976710655L)+1L;

我们在最后添加+1L,因为我们希望它包含最后一个数字以及从1开始而不是从0开始。

如果您需要显示serialCodeNumber的HEX字符串,则可以调用:

String serialHex = Long.toHexString(serialCodeNumber);

但请确保根据字符串的长度在左侧添加任何额外的" 0"以便它是6字节= 12个字符长。