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转换操作的原因.
有人能解释一下吗
先感谢您.
在这种情况下,这是非常不必要的,但人们放入"以防万一"的东西.根据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 位
之所以需要这个,是因为一个字节被定义为八位值。按位与的存在是为了阻止潜在的溢出 -> IE 将 9 位分配给一个字节
Java中的一个char是2个字节!这个逻辑是为了阻止溢出。然而,正如下面有人指出的那样,这是毫无意义的,因为演员阵容会为你做这件事。也许有人很谨慎?
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |