Scala中的十六进制字符串为Int,短和长

rsa*_*san 31 scala

只是找不到将Hex字符串转换为Scala中的数字(Int,Long,Short)的方法.

有类似的东西"A".toInt(base)吗?

7za*_*rk7 48

您可以使用Java库:

val number = Integer.parseInt("FFFF", 16)
> number: Int = 65535
Run Code Online (Sandbox Code Playgroud)

或者,如果你感觉很闪亮:-):

implicit def hex2int (hex: String): Int = Integer.parseInt(hex, 16)

val number: Int = "CAFE" // <- behold the magic
number: Int = 51966
Run Code Online (Sandbox Code Playgroud)

-

编辑:另外,如果您没有专门尝试将String参数解析为十六进制,请注意Scala直接支持十六进制整数文字.在这种情况下:

val x = 0xCAFE
> x: Int = 51966
Run Code Online (Sandbox Code Playgroud)

斯卡拉不是很精彩吗?:-)

  • 当谷歌搜索相反的时候来到这里,将int转换为str.对于记录:如果你碰巧有一个bigint,那就是`Integer.toString(number,base)`或`BigInt(number).toString(base)`.(但不适用于36以上的基地,非常烦人) (4认同)
  • 哈哈,记住!你是对的.无论如何,使用Integer scala 2.9解析parseInt方法,但是使用Short和Long不会.有任何想法吗? (2认同)
  • 我认为"Short"正在对Scala的短片进行解析.这适用:val x = java.lang.Short.parseShort("FF",16)// x:Short = 255 (2认同)

Ser*_*nko 29

7zark7答案是正确的,但我想做一些补充.从隐StringInt可能是危险的.相反,您可以使用隐式转换来包装并显式调用解析:

class HexString(val s: String) {
    def hex = Integer.parseInt(s, 16)
}
implicit def str2hex(str: String): HexString = new HexString(str)

val num: Int = "CAFE".hex
Run Code Online (Sandbox Code Playgroud)


Ben*_*oit 11

单线程怎么样?

def hexToInt(s: String): Int = {
    s.toList.map("0123456789abcdef".indexOf(_)).reduceLeft(_ * 16 + _)
}

scala> hexToInt("cafe")
res0: Int = 51966
Run Code Online (Sandbox Code Playgroud)

并回答你的第二个项目:

有没有类似"A".toInt(base)的东西?

是的,仍然是一个单行:

def baseToInt(s: String, base: String): Int = {
    s.toList.map(base.indexOf(_)).reduceLeft(_ * base.length + _)
}

scala> baseToInt("1100", "01")
res1: Int = 12
Run Code Online (Sandbox Code Playgroud)


And*_*w E 6

任何想要将UUID从十六进制转换为十进制数的人都可以借用Benoit的答案并使用BigDecimal进行工作:

scala> "03cedf84011dd11e38ff0800200c9a66".toList.map(
 |   "0123456789abcdef".indexOf(_)).map(
 |     BigInt(_)).reduceLeft( _ * 16 + _)
res0: scala.math.BigInt = 5061830576017519706280227473241971302
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

def hex2dec(hex: String): BigInt = {
  hex.toLowerCase().toList.map(
    "0123456789abcdef".indexOf(_)).map(
    BigInt(_)).reduceLeft( _ * 16 + _)
}

def uuid2dec(uuid: UUID): BigInt = {
  hex2dec(uuid.toString.replace("-",""))
}
Run Code Online (Sandbox Code Playgroud)

然后:

scala> import java.util.UUID

scala> val id = UUID.fromString("3CEDF84-011D-D11E-38FF-D0800200C9A66")
id: java.util.UUID = 03cedf84-011d-d11e-38ff-0800200c9a66

scala> uuid2dec(id)
res2: BigInt = 5061830576017519706280227473241971302
Run Code Online (Sandbox Code Playgroud)

一个实际的应用是在条形码中编码UUID,其中Code128为所有数字生成比使用字母数字字符串更短的条形码.请参阅http://en.wikipedia.org/wiki/Code128#Subtypes上有关子类型"128A"的说明.


ose*_*kar 5

对于 Long 和 Short,也可以直接使用 Java 方法,例如

Long2long(java.lang.Long.valueOf(hexString, 16))
Run Code Online (Sandbox Code Playgroud)

在某些情况下,whereLong2long甚至可以被省略。