31

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

当我这样做时.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' 参数无效”

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

4

5 回答 5

43

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

strtoi(c("0xff", "077", "123"))
#[1] 255  63 123
于 2013-10-21T18:48:16.767 回答
14

有一种使用“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"
于 2013-10-21T18:49:11.483 回答
8

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

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

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

as.numeric(V)
#[1]       41843       71110       95923 10149429248
于 2018-09-01T11:19:57.147 回答
7

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

> strtoi('0x7f8cff8b')
[1] 2139946891
> strtoi('0x8f8cff8b')
[1] NA
于 2017-08-31T00:14:36.140 回答
0

要获得 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) }
于 2020-05-25T13:20:03.773 回答