【问题标题】:Problems with conversion from Int to Byte (Java)从 Int 到 Byte (Java) 的转换问题
【发布时间】:2012-07-23 14:40:17
【问题描述】:

我正在开发一款适用于 Android 的应用。在这个应用程序中,您必须使用 Rijndael 的加密/解密算法。

要使用此算法,我需要安装 IV。在这种情况下是一个字节数组。到目前为止一切顺利。

问题是我必须使用来自用 C# 编写的 Web 服务的相同 IV。

C# 是这样的:

byte[] bytIV = { 121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62 };

当我尝试在 Java 中做同样的事情时,会发生错误,我建议添加几个数字。是什么让代码变成这样:

byte[] bytIV = { 121, (byte) 241, 10, 1, (byte) 132, 74, 11, 39, (byte) 255, 91, 45, 78, 14, (byte) 211, 22, 62 };

还是不行。

有人对我的工作有什么建议吗?

谢谢!


在我在这里使用的示例中,我使用了 (cast) 而不是 (byte)。示例已更正。注意:我的代码中有(演员)。在代码中是(字节)。

【问题讨论】:

  • 首先,请接受您的问题的答案或跟进。其次,IV 中的值现在应该与 C# 中的值相同,所以问题可能出在其他地方。所以下一个问题变成了——这是一个显而易见的问题——“仍然没有工作”是什么意思。意思是?例外?解密不好? CPU烧坏了?会飞的猪?

标签: android arrays int byte rijndael


【解决方案1】:

字节是 8 位有符号的,从 -128 到 127。所以转换 241 将得到 -15,这与 C# 中无符号字节的 241 位相同。我没有看到问题。 但是转换为字节是(byte)241,而不是(cast)241

【讨论】:

    【解决方案2】:

    在 Java 中,字节的范围可以在 -128 到 127 之间。任何大于 128 或小于 -127 的数字都不能放入字节中,这就是它要求强制转换的原因。在 Java 中,您添加这样的转换 (int) 或 (double) 会将数字分别转换为 int 或 double。要解决您的问题,您必须将数组更改为 short 或 int 数组而不是字节数组。然后删除声明中的演员表。以下任何一个都应该适合您。

    int[] bytIV = { 121, 241, 10, 1, 132, 74, 11, 39, 255, 
                                 91, 45, 78, 14, 211, 22, 62 };
    

    short[] bytIV = { 121, 241, 10, 1, 132, 74, 11, 39, 255, 
                                 91, 45, 78, 14, 211, 22, 62 };
    

    【讨论】:

    • 对不起,不要以为我很理解你的例子。我应该使用 int 数组还是 short 数组来代替字节数组?就这样?
    • 嗨 Jason,问题是在创建这个字节数组后不久,我必须将它作为参数传递给 IvParameterSpec 类型的变量,它只接受字节 [] 类型的参数。
    • 您不能可靠地将大于 128 的数字转换为一个字节,这会降低准确性。数组中的数字来自哪里?有没有可能使用其他号码?
    【解决方案3】:

    字节是 8 位有符号的。您正在设置大于该值的数组值。以 241 为例。这就是为什么你需要添加演员表,做一个简单的测试的结果是:

    byte b2 = (byte) 241;           
    System.out.println("" + b2);
    

    输出 = -15

    因此你的问题

    【讨论】:

    • 你想要值 241,你会得到 -15。我想这就是会给你带来麻烦的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多