字节的 Scala 十六进制文字

标签 scala literals scala-2.12

默认情况下,包含 A-F 数字的十六进制文字将转换为 int。当我试图用 清除一个 Int 时0x 它正在正确创建。

val a: Int = 0x34
val b: Int = 0xFF

但是当我试图用 清除一个字节时0x 第二行没有编译
val a: Byte = 0x34
val b: Byte = 0xFF // compilation error

我找到了一种解决方法
val a: Byte = 0x34
val b: Byte = 0xFF.toByte

但是有没有体面的从十六进制文字中清除字节的方法?

例如,我试图以这种方式在 Test 方法中清除 Byte 数组
anObject.someMethod(1, 1.1f, 0xAB, "1") shouldBe
  Array[Byte](0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF)
anObject.someMethod(2, 2.2f, 0xCD, "2") shouldBe
  Array[Byte](0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE)
anObject.someMethod(3, 3.2f, 0xEF, "3") shouldBe
  Array[Byte](0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD)

但不是这样
anObject.someMethod(1, 1.1f, 0xAB.toByte, "1") shouldBe
  Array[Byte](0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte, 0xAF.toByte)
anObject.someMethod(2, 2.2f, 0xCD.toByte, "2") shouldBe
  Array[Byte](0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte, 0xBE.toByte)
anObject.someMethod(3, 3.2f, 0xEF.toByte, "3") shouldBe
  Array[Byte](0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte, 0xCD.toByte)

在 Scala 2.12.4 中测试

最佳答案

您可以使用隐式转换来做到这一点。

前:

def f(b: Byte) = println(s"Byte = $b")
f(0x34)
f(0xFF) // compilation error

后:
implicit def int2Byte(i: Int) = i.toByte

def f(b: Byte) = println(s"Byte = $b")
f(0x34)
f(0xFF)

输出:
Byte = 52
Byte = -1

关于字节的 Scala 十六进制文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926339/

相关文章:

java - 数组文字只能用于声明?

scala - 为了理解 future 和两者

scala - 如何比较泛型枚举值?

c++ - 初始化表

Scala:Cats、OptionT[Future, T] 和 ApplicativeError

scala - 为什么在整数列表上调用 flatMap 会失败?

scala - 如何修复喷雾示例的编译错误?

C++17 十六进制浮点文字单精度后缀冲突?

scala - 当值类型具有不同数量的类型参数时如何覆盖值?

java - 参数类型不是协变的吗?