Scala在无符号和有符号字节之间转换

时间:2019-07-18 11:26:50

标签: scala

我有一个这样的无符号数据表示形式:

val str = "145 38 0 255 0 1"

我现在想获得此无符号表示形式的byteString,然后我可以对各个位进行操作以提取信息。所以基本上我想要的是获得未签名的版本。

例如,145的无符号二进制表示形式为10010001,而有符号版本为-00000111。

scala> 145.byteValue
res128: Byte = -111 // I would need an unsigned value instead!

那么有功能或方法可以将145转换为无符号表示吗?

1 个答案:

答案 0 :(得分:1)

有符号和无符号字节(或Ints或Longs)只是解释相同二进制位的两种不同方式。 在带符号字节中,从左起的第一位(最高有效位)被解释为符号。

0表示正,1表示负。

对于负数,减号之后是256 - unsigned-value。 因此,在您的情况下,我们得到的是256 - 145 = 111

Java / Scala bitwise operators在基础位上工作,而不是在有符号/无符号表示上工作,但当然结果在打印时仍会解释为有符号。

实际上,为了避免造成混乱,我只想处理Ints(或短裤)。 但是,它也可以和字节一起使用。

例如,要获得第n位,您可以执行以下操作:


def bitValue(byte: Byte, n: Byte) = {
    val pow2 = Math.pow(2, n - 1).toInt
    if((pow2 & byte) == 0) 0
    else 1
}

bitValue(145.byteValue, 8)
res27: Int = 1