当前位置: 首页 > 知识库问答 >
问题:

从int到字节的有损转换?[副本]

汪玮
2023-03-14

我的简单加密算法我正在做的一个练习是给我一个可能的有损转换从int到字节?但我不知道为什么它会给我这个错误任何想法?

public class Rot13Crypt extends CryptStream
{
    public Rot13Crypt(StreamPair theStreams)
    {
        super(theStreams);
    }
    protected byte [] cryptData(byte [] data, int len)
    {
        byte [] cryptedByte = new byte[len];
        for(int i = 0; i < len; i++)
        {
            cryptedByte[i] = (data[i] + 13) % 256;
        }
        return cryptedByte;
    }
    protected byte [] decryptData(byte [] data, int len)
    {
        byte [] decryptedByte = new byte[len];
        for(int i = 0; i < len; i++)
        {
            decryptedByte[i] = (data[i] * 256) - 13;
        }
        return decryptedByte;
    }
}

共有1个答案

陆子默
2023-03-14

它会给出错误消息,因为您试图将int值表达式的值赋给字节。这是一个潜在的有损操作:直觉上,您不能将所有可能的int值放入一个byte中。

Java语言要求在将int值表达式赋给字节时使用(byte)强制转换。

有两个地方可以这样做:

   cryptedByte[i] = (data[i] + 13) % 256;

   decryptedByte[i] = (data[i] * 256) - 13;

只有当表达式是编译时常量表达式并且表达式的实际值在字节范围内时,才能将int值表达式赋给字节而不进行类型转换。

如果您感兴趣,请在JLS 15.2赋值上下文中指定:

此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):

    null

没有。您需要强制转换整个表达式;例如。

   cryptedByte[i] = (byte) ((data[i] + 13) % 256);
 类似资料:
  • 为什么b=b+8抛出错误,其中b+=8为dosent。

  • 问题内容: 我已经定义了数组gx,数组arr为短型。但是为什么左边的运算可能会以int类型结束,而我必须将其转换为short?编译器错误可能是从int到short的有损转换。 这是我的代码。 } 那是因为所谓的拆箱吗?因此,这意味着我每次进行手术时都需要进行投射吗? 问题答案: 它不是开箱;这是“二进制数值提升”。 JLS的第5.6.2节规定: 当运算符将二进制数字提升应用于一对操作数时,每个操作

  • 我试图用java将十六进制数据写入我的串口,但是现在我不能将十六进制数据转换成字节数组。 以下是显示错误消息的代码: 这是写入串行端口的代码: 我能知道如何解决这个问题吗?目前我正在使用javax.comm插件。谢谢。

  • 所以我最近写了以下代码: 当我尝试使用cmd运行它时,它一直显示以下内容: 有人能帮我解释一下我犯的错误吗?

  • 问题内容: 所以我最近写了下面的代码: 但是,它一直显示: 当我尝试使用cmd运行它时。 有人可以帮助并解释我所犯的错误吗?任何帮助表示赞赏:)。谢谢! 问题答案: 当您转换到,值的精度损失。例如,当您将4.8657(double)转换为int时,int值将为4.Primitive 不存储十进制数字,因此您将丢失0.8657。 在您的情况下,0.7是一个双精度值(除非提到float-0.7f,否则

  • 我希望输入一个和另一个ex: 1和1000000000,现在我希望创建一个大小为1000000000的数组。然后在数组的每个索引处,存储int val,ex:。 当我尝试执行此操作时,Netbeans 会向我显示此行中的错误: “可能从long到int的有损转换”。这是我的密码:-