如何将无符号字节传递给 SecretKeySpec()?
How to pass unsigned bytes to SecretKeySpec()?
我需要将 Java 的 SecretKeySpec()
与大于 127 的数字数组一起使用。
如果我执行以下操作:
new byte[] { (byte)0xD9, (byte)0xDF, (byte)0x85 }
数字被转换为字节,它们将是负数。
当然我可以用 0xFF
&
它们并将它们保存在 short
数组中并保存它们的值,但是我将无法将此数组传递给SecretKeySpec()
,因为它只接收一个bytes[]
数组。
有什么想法吗?
这实际上只是一个渲染问题。 SecretKeySpec
与字节数组一起工作,构造字节数组没有问题。唯一的问题是如何将大(>127)整数表示为 java 字节,或者等效地,将“217”表示为一个字节。
您可以使用任何您想要的映射,但 Java 有一个非常自然的选择 - 将整数转换为字节,使用强制转换,(byte)i
,并转换回来,使用 Byte.toUnsignedInt(b)
。如您所见,这将恢复原始值:
public static void main( String[] args )
{
for (int count = 0; count<256; count++){
System.out.println(count+" : "+(byte)count+" => "+Byte.toUnsignedInt((byte)count));
}
}
好像没有必要那样做。
我在 Java 中将有符号值写入 byte[]
数组,并在 C# 中将它们读取为无符号(例如 Java 的 -16
在 C# 中读取 240
) .但解密仍然有效。这似乎在 Rijndael 算法中得到了处理。
我需要将 Java 的 SecretKeySpec()
与大于 127 的数字数组一起使用。
如果我执行以下操作:
new byte[] { (byte)0xD9, (byte)0xDF, (byte)0x85 }
数字被转换为字节,它们将是负数。
当然我可以用 0xFF
&
它们并将它们保存在 short
数组中并保存它们的值,但是我将无法将此数组传递给SecretKeySpec()
,因为它只接收一个bytes[]
数组。
有什么想法吗?
这实际上只是一个渲染问题。 SecretKeySpec
与字节数组一起工作,构造字节数组没有问题。唯一的问题是如何将大(>127)整数表示为 java 字节,或者等效地,将“217”表示为一个字节。
您可以使用任何您想要的映射,但 Java 有一个非常自然的选择 - 将整数转换为字节,使用强制转换,(byte)i
,并转换回来,使用 Byte.toUnsignedInt(b)
。如您所见,这将恢复原始值:
public static void main( String[] args )
{
for (int count = 0; count<256; count++){
System.out.println(count+" : "+(byte)count+" => "+Byte.toUnsignedInt((byte)count));
}
}
好像没有必要那样做。
我在 Java 中将有符号值写入 byte[]
数组,并在 C# 中将它们读取为无符号(例如 Java 的 -16
在 C# 中读取 240
) .但解密仍然有效。这似乎在 Rijndael 算法中得到了处理。