在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中将十六进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

在R中将十六进制转换为十进制

如何在R中将时间(mm:ss)转换为十进制形式

在R中将字符串转换为二进制向量

在Postgres中将十六进制字符串转换为bigint [重复]

在android中将图像转换为二进制图像

如何在 Python 中将十六进制转换为十进制? [复制]