为什么需要“位”和“位”?用于Java中某些字符到字节的转换

本文关键字:字符 到字节 转换 用于 为什么 Java | 更新日期: 2023-09-27 17:51:00

这里我正在使用Java到c#示例应用程序翻译,涉及加密(AES和RSA等…)

在Java代码的某个地方(实际工作并被翻译成c#的代码),我发现了这段代码:

for (i = i; i < size; i++) {
    encodedArr[j] = (byte) (data[i] & 0x00FF);
    j++;
} // where data variable is a char[] and encodedArr is a byte[]

在google(这里)搜索之后,我发现这是Java代码中常见的行为…

我知道char是16位类型,byte是8位类型,但我无法理解char->byte转换的这种位和操作的原因。

有人能解释一下吗?

提前感谢。

为什么需要“位”和“位”?用于Java中某些字符到字节的转换

在这种情况下,这是完全不必要的,但人们放在"以防万一"的那种东西。根据JLS,是5.1.3。缩小原语转换

从char类型到整型T的窄化转换同样简单丢弃除n个最低位之外的所有位,其中n是用于表示类型t的位除了可能丢失之外有关数值大小的信息,这可能导致结果值必须是一个负数,即使是字符表示16位无符号整数值。

在扩展转换中经常需要类似的代码来抑制符号扩展。

当你将0x00FF转换为二进制时,它变成了0000 0000 1111 1111

当你和任何带有1的东西在一起时,它就是它自己:

1 && 1 = 1, 0 && 1 = 0

当你和任何带0的东西时,它是0

1 && 0 = 0, 0 && 0 = 0

当这个操作发生encodedArr[j] = (byte) (data[i] & 0x00FF);时,它取数据的最后8位并且只取数据的最后8位并存储它。它会丢弃前8位并存储后8位

这样做的原因是字节被定义为8位值。位和存在以阻止潜在的溢出-> IE将9位分配到一个字节

Java中的char是2字节!这个逻辑是用来阻止溢出的。然而,正如下面有人指出的那样,这是毫无意义的,因为演员已经为你做了。也许有人很谨慎?

这是一种截断值的方法,只保留最低有效位,所以它"适合"在一个字节中!

我希望它有帮助!