[英]Java generate code byte 256*256 & 0xff
我需要生成一个3字节的代码(如A502F1)。 我有一个标准:
第一个字节是(serialCodeNumber /(256 * 256))&0xFF
第二个是(serialCodeNumber / 256)&0xFF
第三是(serialCodeNumber)&0xFF
serialCodeNumber是序列1-0xFFF
这意味着什么!?
我会这样生成:
String codeNum = new BigInteger(256, random).toString(16).toUpperCase().substring(0, 6);
但是,按照需求说明,正确的做法是什么?
我不太确定serialCodeNumber
,因为如果稍后将其除以65025,它必须比0xFFF(即4095)大很多,以使其具有合理的意义。
但是,让我们看一下条件,一旦您习惯了按位AND运算符,它们都将变得有意义。 在这里可以很好地了解它是如何工作的,但是我认为该问题的实质是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};
并从该问题中借用一些方法将字节数组转换为HEX字符串。
String codeNum = bytesToHex(myArray);
结果将如下所示:
F03DD7
编辑:
由于您必须生成一个序列号,该序列号的值最多必须为6个字节,因此建议您使用一个long
。
6个字节的数字将介于1到281474976710655之间,因此您可能需要随机生成一个。
首先实例化一个Random
对象,您将能够从中轮询数字:
Random random = new Random();
一旦有了它,就从它中轮询一个long
的范围为1到281474976710655。
因此,您可以像这样生成数字:
long serialCodeNumber = nextLong(random, 281474976710655L)+1L;
我们在末尾添加+1L
,因为我们希望它包含最后一个数字,并从1开始而不是0。
如果您需要显示serialCodeNumber的十六进制字符串,则可以调用:
String serialHex = Long.toHexString(serialCodeNumber);
但是请确保根据字符串的长度在左侧添加任何其他“ 0”,以使其为6个字节= 12个字符长。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.