Подтвердить что ты не робот

Hex String to Int, Short и Long in Scala

Просто не могу найти способ преобразования шестнадцатеричной строки в число (Int, Long, Short) в Scala.

Есть ли что-то вроде "A".toInt(base)?

4b9b3361

Ответ 1

Вы можете использовать Java libs:

val number = Integer.parseInt("FFFF", 16)
> number: Int = 65535

Или если вы чувствуете себя искрами: -):

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

val number: Int = "CAFE" // <- behold the magic
number: Int = 51966

-

Edit: ТАКЖЕ, если вы не пытаетесь разобрать параметр String в hex, обратите внимание, что Scala напрямую поддерживает шестнадцатеричные целые литералы. В этом случае:

val x = 0xCAFE
> x: Int = 51966

Разве не Scala замечательный?: -)

Ответ 2

7zark7 ответ правильный, но я хочу сделать некоторые дополнения. Неявно от String до Int может быть опасно. Вместо этого вы можете использовать неявное преобразование в оболочку и явно разобрать разбор:

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

Ответ 3

Как насчет однострочного интерфейса?

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

scala> hexToInt("cafe")
res0: Int = 51966

И чтобы ответить на ваш второй пункт:

Есть ли что-то вроде "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

Ответ 4

Любой, кто хочет преобразовать UUID из шестнадцатеричного числа в десятичное число, может заимствовать у Benoit ответ и использовать BigDecimal для задания:

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

Или в более общем плане:

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

def uuid2dec(uuid: UUID): BigInt = {
  hex2dec(uuid.toString.replace("-",""))
}

Тогда:

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

Одним из практических приложений для этого является кодирование UUID в штрих-коде, где Code128 создает более короткий штрих-код для всех цифр, чем для буквенно-цифровых строк. См. Примечания о подтипе "128A" на http://en.wikipedia.org/wiki/Code128#Subtypes.

Ответ 5

Для длинного и короткого, также можно использовать методы Java непосредственно, как

Long2long(java.lang.Long.valueOf(hexString, 16))

где Long2long можно даже опустить в некоторых случаях.