在R中将十六进制转换为十进制
Posted
技术标签:
【中文标题】在R中将十六进制转换为十进制【英文标题】:Convert hex to decimal in 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。
谢谢卡尔!出于某种原因,这个功能没有出现在我的谷歌搜索中,但它似乎工作得很好。 :) 干杯!
【参考方案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)
【讨论】:
以上是关于在R中将十六进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章