Java 将 4 个字节转换为 int

标签 java casting packing

我想知道这个解决方案是否记录了 here仍然是解决方案还是有任何其他方法从 4 个字节获取 int?

谢谢。

编辑:我从 sockets .read 获取 byte[]

编辑:int recvMsgSize = in.read(Data, 0, BufferSize); 如果 recvMsgSize 为 -1,我知道连接已断开。

当我使用 DataInputStream 而不是 InputStream 时如何检测到这个?

谢谢。

编辑:为接受正确答案而成为溜溜球而道歉。但在 mihi 更新最终回复后,该方法似乎是可靠的并且减少了扩展编码,在我看来是最佳实践。

最佳答案

您必须非常小心地进行任何扩大转换和数字提升,但下面的代码将 4 byte 转换为 int:

    byte b1 = -1;
    byte b2 = -2;
    byte b3 = -3;
    byte b4 = -4;
    int i = ((0xFF & b1) << 24) | ((0xFF & b2) << 16) |
            ((0xFF & b3) << 8) | (0xFF & b4);
    System.out.println(Integer.toHexString(i)); // prints "fffefdfc"

另见

  • Java code To convert byte to Hexadecimal
    • 注意使用 & 0xFF 进行屏蔽的必要性——如果您正在使用 byte,您可能最终会做很多这样的事情,因为所有算术操作提升为int(或long)

关于Java 将 4 个字节转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840190/

相关文章:

java - 使用 Apache CXF 客户端传递 SOAP header 时出现问题

java - 使用 Log4j 创建每日日志?

c++ - 将 32 位 float 打包成 30 位 (c++)

C++ Static_cast 指向虚拟基类的指针

c - 给定宽度和长度的矩形的包装

c - 位字段更加优化

java - .equals() 方法是否适用于 StringBuilder?

java - 提高优先级队列堆中的键搜索时间复杂度

Java,以字节存储大于127的值

generics - 如何在 Rust 中转换泛型原始类型?