gpt4 book ai didi

java - 将 int 转换为 byte 在 Netbeans 和 JCreator 中给出不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:17 24 4
gpt4 key购买 nike

根据OP的评论:不能再复制了

我使用 NetBeans 开发我的 Java 程序,它们运行良好。但是当我为我的程序创建一个 JAR 文件时,它会为我提供相同输入的不同输出。

我很难调试,我发现在 NetBeans 中,当我将 int 转换为 byte 时,结果范围在 [-128; 128),而JCreator中相同的代码在[0; 256)

如何使范围始终[-128; 128)?

private static byte[] convertHexString(String ss) {
try{
byte digest[] = new byte[ss.length() / 2];
for (int i = 0; i < digest.length; i++) {
String byteString = ss.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte) byteValue;
}
// Test
for(int i = 0; i < digest.length; ++i){
System.out.println(digest[i]);
}

return digest;
}
catch(Exception e){
return null;
}
}

最佳答案

它看起来确实像一个错误。 byte 的范围是 -128 到 127,而不是 0 到 255。

这是我认为字节值为 -1(即 0Xff)时发生的情况,它会打印 255:

public static void main(final String... args)
{
final ByteBuffer buf = ByteBuffer.allocate(4);

// What Java would do on casting...
buf.put((byte) 0xff);
buf.put((byte) 0xff);
buf.put((byte) 0xff);
buf.put((byte) 0xff);

buf.rewind();

System.out.println(buf.getInt()); // -1 -- good

buf.rewind();

// What JCreator seems to do on casting...
buf.put((byte) 0);
buf.put((byte) 0);
buf.put((byte) 0);
buf.put((byte) 0xff);

buf.rewind();

System.out.println(buf.getInt()); // 255 -- WRONG
}

也就是说,当从字节“向上转换”到整数时,无论您使用什么 Java 编译器都不会执行 JLS 要求它执行的操作,即携带符号位。

出于这个原因,我严重怀疑您在命令行中使用的编译器/运行器是否也是 Oracle 的 JDK。

(注意 PrintStreama method to print an int ,但 byte 没有;因此 byte 被提升为 int)

关于java - 将 int 转换为 byte 在 Netbeans 和 JCreator 中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com