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

Java generate code byte 256*256 & 0xff

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

1st byte is (serialCodeNumber / (256*256) ) & 0xFF

2nd is (serialCodeNumber / 256) & 0xFF

3th is (serialCodeNumber) & 0xFF

serialCodeNumber is a sequence 1-0xFFF

这是什么意思!?

我会这样生成它:

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

但是按照要求怎样做才是正确的呢?

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

但是让我们看一下条件,一旦您习惯了按位 AND 运算符,它们就都有意义了。有一本好书 here on how it works but the meat of the matter from that question in my opinion is this sentence by Markus Jarderot:

The result is the bits that are turned on in both numbers.

因为在你的条件下你有 & 0xFF 并且 0xFF 是 255,或者在二进制中它是 11111111 前八位全部打开。这是一个巧妙的技巧,只检索任何数字的前 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.

借用一些关于如何将字节数组转换为十六进制字符串的方法
String codeNum = bytesToHex(myArray);

结果将如下所示:

F03DD7

编辑:

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

一个 6 字节的数字将是 1 到 281474976710655 之间的任何地方,因此您可能需要随机生成一个。

首先实例化一个 Random 对象,您可以从中轮询号码:

Random random = new Random();

一旦你有了它,从中轮询一个 long 范围从 1 到 281474976710655。

为此你可以借 KennyTM's answer from this question.

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

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

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

如果您需要显示 serialCodeNumber 的十六进制字符串,您只需调用:

String serialHex = Long.toHexString(serialCodeNumber);

但请确保根据字符串的长度在左侧添加任何额外的“0”,使其达到 6 字节 = 12 个字符长。