【问题标题】:Convert hex to decimal in R在R中将十六进制转换为十进制
【发布时间】:2013-10-30 09:24:37
【问题描述】:

我发现fBasics 包中有一个名为.hex.to.dec 的函数。

当我执行.hex.to.dec(a) 时,它会起作用。

我有一个数据框,其中有一列 samp_column 包含这样的值:

a373, 115c6, a373, 115c6, 176b3

当我执行.hex.to.dec(samp_column) 时,我收到此错误:

“nchar(b) 中的错误:'nchar()' 需要字符向量”

当我执行.hex.to.dec(as.character(samp_column)) 时,我收到此错误:

"rep(base.out, 1 + 上限(log(max(number), base = base.out))) : 'times' 参数无效"

最好的方法是什么?

【问题讨论】:

  • strtoi 会做到的。或者很长的路要走:Rutils::as.character.binmode 然后用as.numeric 将字符转换为数字:-)
  • 请阅读how to format your question,然后阅读包含您的数据的how to make a reproducible example
  • 谢谢卡尔!出于某种原因,这个功能没有出现在我的谷歌搜索中,但它似乎工作得很好。 :) 干杯!

标签: r hex decimal


【解决方案1】:

使用base::strtoi将十六进制字符向量转换为整数:

strtoi(c("0xff", "077", "123"))
#[1] 255  63 123

【讨论】:

  • 基于数字的转换是难以找到正确帮助页面的任务之一。转换函数遍布各地,名称各异。另请参阅?hexmode?as.hexmode?octmode
  • 好的,现在谁在发布简短的答案? :-)。 PS thx 弹球表扬。
  • @CarlWitthoft 哈!好的,重点。我更愿意将此视为一个最低限度的可行示例,但正如您所说,这是一个细线弹球向导。 :-)
  • 出于某种原因,当我尝试效仿您的示例并尝试 strtoi(c('a','b','c','d','e','f')) 时,我得到的只是 NA。但是你的例子工作得很好。我在这里想念什么?编辑:好的,我需要在每个十六进制数字之前添加0x
【解决方案2】:

有一种简单通用的方法可以转换十六进制使用“C/C++方式”的其他格式:

V <- c(0xa373, 0x115c6, 0xa373, 0x115c6, 0x176b3)

sprintf("%d", V)
#[1] "41843" "71110" "41843" "71110" "95923"

sprintf("%.2f", V)
#[1] "41843.00" "71110.00" "41843.00" "71110.00" "95923.00"

sprintf("%x", V)
#[1] "a373"  "115c6" "a373"  "115c6" "176b3"

【讨论】:

    【解决方案3】:

    @user4221472's answer 中所述,strtoi() 会溢出大于 2^31 的整数。

    最简单的方法是使用as.numeric()

    V <- c(0xa373, 0x115c6, 0x176b3, 0x25cf40000)
    
    as.numeric(V)
    #[1]       41843       71110       95923 10149429248
    

    【讨论】:

    • 很好...你可以补充一下,如果你不喜欢科学记数法,你可以设置options(digits = 22)
    【解决方案4】:

    strtoi() 有 31 位的限制。设置高位的十六进制数返回NA

    > strtoi('0x7f8cff8b')
    [1] 2139946891
    > strtoi('0x8f8cff8b')
    [1] NA
    

    【讨论】:

      【解决方案5】:

      要获得一个 16 位的有符号值:

        temp <- strtoi(value, base=16L)
        if (temp>32767){ temp <- -(65535 - temp) }
      

      一般形式:

        max_unsigned <- 65535 #0xFFFF
        max_signed <- 32767 #0x7FFF
        temp <- strtoi(value, base=16L)
        if (temp>max_signed){ temp <- -(max_unsigned- temp) }
      

      【讨论】:

        猜你喜欢
        • 2017-10-15
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 2018-09-04
        • 2017-07-31
        • 2015-11-11
        相关资源
        最近更新 更多