为什么需要对Java中的某些字符转换进行逐位"和"?

cez*_*ann 6 c# java bit-manipulation type-conversion

在这里,我正在使用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[]
Run Code Online (Sandbox Code Playgroud)

经过一些谷歌搜索(这里),我已经看到这是一个主要在Java代码上的常见行为...

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

有人能解释一下吗

先感谢您.

Pat*_*han 7

在这种情况下,这是非常不必要的,但人们放入"以防万一"的东西.根据JLS,5.1.3.缩小原始转换

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

在扩展转换以抑制符号扩展时,通常需要类似的代码.

  • 代码是Java,但他正在转换为C#,所以它只是一个重要的注意事项,因为它无法在C#端删除. (2认同)

Dud*_*ord 4

当你将 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 位

之所以需要这个,是因为一个字节被定义为八位值。按位与的存在是为了阻止潜在的溢出 -> IE 将 9 位分配给一个字节

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