繁体   English   中英

Java生成代码字节256 * 256和0xff

[英]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。

为此,您可以从该问题中借用KennyTM的答案。

因此,您可以像这样生成数字:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM