我需要生成一个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);
但是,正如要求所说,正确的做法是什么?
答案 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个字符长。