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

alb*_*ano 24 hex r decimal

我发现包中有调用.hex.to.dec的函数fBasics.

当我这样做时.hex.to.dec(a),它有效.

我有一个数据框,其中samp_column包含由以下值组成的列:

a373, 115c6, a373, 115c6, 176b3
Run Code Online (Sandbox Code Playgroud)

当我这样做时.hex.to.dec(samp_column),我收到此错误:

"nchar(b)中的错误:'nchar()'需要一个字符向量"

当我这样做时.hex.to.dec(as.character(samp_column)),我收到此错误:

"rep中的错误(base.out,1 + ceiling(log(max(number),base = base.out))):无效的'times'参数"

这样做的最佳方式是什么?

Sim*_*lon 30

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

strtoi(c("0xff", "077", "123"))
#[1] 255  63 123
Run Code Online (Sandbox Code Playgroud)

  • 跨数字基础的转换是难以找到正确的帮助页面的任务之一.转换函数遍布各处,名称不同.另请参阅`?hexmode`,`?as.hexmode`和`?octmode` (5认同)
  • 出于某种原因,当我尝试按照你的例子尝试`strtoi(c('a','b','c','d','e','f'))`时,我得到的只是NA . 但是你的例子工作得很好。我在这里缺少什么?编辑:好的,我需要在每个十六进制数之前添加“0x”。 (2认同)

小智 11

有一种简单而通用的方法可以使用"C/C++方式"转换hex < - >其他格式:

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"
Run Code Online (Sandbox Code Playgroud)


Fat*_*o39 7

正如@user4221472 的回答中提到strtoi()大于 2^31 的整数溢出。

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

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

as.numeric(V)
#[1]       41843       71110       95923 10149429248
Run Code Online (Sandbox Code Playgroud)


小智 5

strtoi()限制为31位.高位设置的十六进制数字返回NA:

> strtoi('0x7f8cff8b')
[1] 2139946891
> strtoi('0x8f8cff8b')
[1] NA
Run Code Online (Sandbox Code Playgroud)

  • 这应该是对已接受答案的评论. (6认同)