web-dev-qa-db-ja.com

Rで16進数を10進数に変換する

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 + ceiling(log(max(number)、base = base.out)))のエラー:無効な 'times'引数」

これを行う最良の方法は何でしょうか?

24
albay_aureliano

使用する base::strtoiは、16進数の文字ベクトルを整数に変換します。

strtoi(c("0xff", "077", "123"))
#[1] 255  63 123
30
Simon O'Hanlon

「C/C++の方法」を使用して16進<->その他の形式に変換する簡単で一般的な方法があります。

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"
11

strtoi()には31ビットの制限があります。上位ビットが設定された16進数はNAを返します。

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

@ user4221472の回答 で述べたように、strtoi()は2 ^ 31より大きい整数でオーバーフローします。

これを回避する最も簡単な方法は、as.numeric()を使用することです。

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

as.numeric(V)
#[1]       41843       71110       95923 10149429248
3
Fato39