尽管您不能在Java中使用无符号字节,但是您可以简单地忽略该问题。
AES和所有现代对称密码都以字节为单位,并且输入和输出已定义为字节(或八位位组)。输入和输出已通过NIST进行了标准化,并且可以使用测试向量。
如果查看字节的单独位内容,则
{200,201,202}C#和
{(byte)200, (byte)201,(byte)202}Java中的相同。这是因为Java使用字节的二补码表示。
将数字
200作为整数:将以
11010000二进制形式表示,
-56如果用两个补数的(带符号)字节使用,则表示Java中的数字。现在,对称密码将简单地将这些位转换为另一个(通常使用完整的位
块 )。
找到答案后, 当您查看单独的位时 ,您会发现它们在C#和Java中都是相同的。但是,C#将把它们解释为无符号值,将Java解释为有符号值。
如果要打印或将这些值用作Java中的带符号数字,则必须将它们转换为带正符号的整数。做到这一点的方法是使用
int p = b & 0xFF。
这将执行以下 *** 作(我将再次使用数字200):
- (负)字节值扩展为带符号的整数,记住符号位:
11010000变成
11111111 11111111 11111111 11010000
- 使用
0xFF
或00000000 00000000 00000000 11111111
通过执行二进制AND运算符可“屏蔽”此值:
11111111 11111111 11111111 11010000 & 00000000 00000000 00000000 11111111 =00000000 00000000 00000000 11010000
该值与
200带符号整数的值相同。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)