【问题标题】:Why have leading ffffff for single byte为什么单字节有前导 ffffff
【发布时间】:2017-11-08 15:17:30
【问题描述】:

我正在读取数据,有些是 1 字节,有些是 2 字节,有些是 3 字节等。对于单字节

byte qtySat = r.readByte(); 

对于 2 个字节,我读为

int serialNumber = r.readUnsignedShort();

阅读一切正常,运行良好。当我转换为以十六进制格式显示时的问题我得到了有趣的场景。例如对于

Integer.toHexString(qtySat )

我得到的输出是 ffffffce 但我只想要 ce ?

然后对于 Integer.toHexString(serialNumber) 我得到输出为 A1 但我希望前导 00 A1 导致这 2 个字节的数据。我应该对 Integer.toHexString 做哪些更改?

【问题讨论】:

    标签: java hex type-conversion


    【解决方案1】:

    如果字节(8 位)qtySat 变量为负数,则在提升为整数时将添加前导数,这就是 Integer.toHexString(int) 所要求的参数

    要摆脱那些你需要确保非否定论点的人

    System.out.println(Integer.toHexString(Math.abs(serialNumber)));
    

    【讨论】:

    • 我的号码不应该是负数,那么删除 ff 最好的是什么?
    • @eran 我的第二种情况如何说它 2 字节然后我想要额外的前导 00 A1 。因此,当我运行 Integer.toHexString(serialNumber) 时,我希望出现前导零。
    • 然后按位屏蔽它,请参阅 erans 答案
    【解决方案2】:

    Integer.toHexString(qtySat ) 为您提供传递给它的int 值的二进制表示。如果您传递的是负数 byte,它将变成具有相同值的负数 int,这解释了您所看到的所有 1 位。

    您可以使用Integer.toHexString(qtySat & 0xff)将除低8位以外的所有位设置为0,然后再转换为十六进制字符串。

    byte qtySat = (byte)0xce;
    System.out.println (qtySat);
    System.out.println (Integer.toHexString(qtySat & 0xff));
    

    打印

    -50
    ce
    

    【讨论】:

    • 我的号码不应该是负数,那么删除 ff 最好的是什么?
    • @user8012596 我写了一个建议如何删除它。
    • 所以我只添加这个 & 0xff 是否意味着它将删除前导 ffffff?
    • 我的第二个场景怎么样说它 2 字节然后我想要额外的前导 00 A1 。因此,当我运行 Integer.toHexString(serialNumber) 时,我希望出现前导零。
    • @user8012596 是的,int 的前 24 位将变为 0,剩余的后 8 位保持不变。
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多