如何在Scala中将长十六进制字符串转换为BigInt

4

我有一个非常长的十六进制字符串。

val hexStr = "6579ba5175087ae94f289dc46b4aab805217d7c0372f68631442e0950b535a3a2c566cacd4c8f367e68d39fd07e88adcc3e6497dc793c2dcad994dd3b5c4b74a20e816695d82856b0d8c2853141bb9bb2236c6ddc07b60075fe37d5f60287e0b542c6c47ec172883e79adf83d19163d698c50ab8e70d862ae4ea38964031c97d"

val hexMap = ('A' to 'F').zipWithIndex.map{case  (c,i) => (c, i+10) }.toMap
def toHex(str: String) = {
      def toDec:PartialFunction[Char, Int] = {
        case c if hexMap.isDefinedAt(c)=>
          hexMap(c)
        case c  => c.asDigit
      }
      val h = str.reverse.zipWithIndex
      h.foldLeft(BigInt(0)){ case (x,(c,i)) =>  x + (BigInt(toDec(c)) * (BigInt(16) pow i))
      }
    }

调用toHex(hexStr)将产生

-108510794603240369573054864637132287318772867810563957913302194314864518557374668031774623887439510929033883541346004435263772843343293163699936959100821415781894682693381965433598320482583614884522426697017992684587643668557555164019950155571119830400184127425065856214285578629986381577449968065171417872003

编辑: 似乎字符串中存在错误,不管怎样,建议的解决方案更好。

注:本段内容与IT技术无关。


2
你怎么能“超过BigInt”?BigInt的整个目的就是它可以是任意大的,不是吗? - Jörg W Mittag
@JörgWMittag,同意,也许这不是正确的观察。 - igx
1个回答

7
BigInt(hexStr, 16)
//res0: scala.math.BigInt = 71258518882991221199875654441770186043024830083666699360127886842868157248126295100933853434968025092086230338525388922395016925471123458792910471538652708595873210731483519842703899118662479234930656255067013084250507013784907717453962954969707406763166383259520442025661667308493334727385388264452806265213

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接