V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
xuroid
V2EX  ›  Android

在 Java 中怎么转换 unsigned 类型的字节数据?

  •  
  •   xuroid · Nov 28, 2019 · 13533 views
    This topic created in 2346 days ago, the information mentioned may be changed or developed.
    服务器发给客户端的数据中有四个字节是 unsigned int 型的字节数据,怎么用 Java 转换成 int 呢?
    说是十六位数据,去掉符号位,再转 int,可是不太会操作哎,直接每个元素&0xff 出来的结果不对。小白请求了。
    6 replies    2019-11-28 17:57:19 +08:00
    xuroid
        1
    xuroid  
    OP
       Nov 28, 2019
    已解决,这种弱智问题真不应该马上发出来问大家,又删不了贴子。
    qwerthhusn
        2
    qwerthhusn  
       Nov 28, 2019
    说实话,问题感觉都没说清楚。

    “在 Java 中怎么转换 unsigned 类型的字节数据?”,字节就是字节,没有有符号无符号的说法,就是八个一零位,看你咋看这个字节。
    所以问题应该是“在 Java 中怎么将四个字节转成 unsigned int”。可以看 Guava 库的 Ints.fromBytes 工具类,,
    而且也没说这四个字节是大端还是小端,那就默认按大端来。

    public static int fromBytes(byte b1, byte b2, byte b3, byte b4) {
    return b1 << 24 | (b2 & 0xFF) << 16 | (b3 & 0xFF) << 8 | (b4 & 0xFF);
    }

    Java 中没有 unsigned 这一说,只能用 long 来表示 unsigned int。。看 java.lang.Integer#toUnsignedLong 有现成方法
    diveIntoWork
        3
    diveIntoWork  
       Nov 28, 2019
    unsigned int 范围是:0 ~ 4294967295
    java 中的 int 范围是:-2147483648 ~ 2147483647
    同样是四个字节,因为 java 中最高位是符号位,所以表示的最大值比 unsigned int 小一半。
    所以,要把 unsigned int 转成 java 中的 int,至少用 5 个字节
    szq8014
        4
    szq8014  
       Nov 28, 2019
    用 long 就可以了。哈哈哈哈哈哈
    leon0903
        5
    leon0903  
       Nov 28, 2019
    long 应该就可以了吧
    xuanbg
        6
    xuanbg  
       Nov 28, 2019
    楼主的问题描述看得我都晕了,最后反应过来不就是 int 有符号不够大吗?不够大用 long 啊。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2656 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 14:26 · PVG 22:26 · LAX 07:26 · JFK 10:26
    ♥ Do have faith in what you're doing.