Rで10進数→16進数、16進数→10進数の変換
10進数から16進数に変換する方法の1つとして、sprintfを使う方法があります。
> sprintf("%X", 0:31)
[1] "0" "1" "2" "3" "4" "5" "6" "7"
[9] "8" "9" "A" "B" "C" "D" "E" "F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"
16進といえば、色のRGB値を指定するときに使ったりしますが、その場合は "7" とか "F" ではなく "07" とか "0F" とかの形で欲しいですよね。
そういうときは、
> sprintf("%02X", 0:31)
[1] "00" "01" "02" "03" "04" "05" "06" "07"
[9] "08" "09" "0A" "0B" "0C" "0D" "0E" "0F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"
とすればOK。
sprintfの書式を知っている人には蛇足ですが、「%02X」の意味は、
"X": 16進で
"2": 2桁で
"0": 桁が足りないときは0詰めで
という指示になります。
16進数でのRGB指定を使ってちょっと遊んでみましょう。
# まず枠だけプロット
plot( 0, 0, xlim=c(0,255), ylim=c(0,255),
type="n", xlab="R", ylab="G" )
# 16進の値を取り出すためのテーブル
h <- sprintf("%02X", 0:255)
for(r in 1:256) {
for(g in 1:256) {
col <- paste("#", h[r], h[g], "00", sep="")
points(r, g, col=col)
}
}
青(B)を固定して、赤(R)と緑(G)を変化させたグラデーションができました。
また、10進から16進への変換を行う方法として、as.hexmode関数を使うというのもあります。
> as.hexmode(31)
[1] "1f"
表示結果は文字列(character)っぽいですが、実は違っていて、hexmodeという16進の型になっているみたいです。
> class(as.hexmode(31))
[1] "hexmode"
なので、
> a <- as.hexmode(7)
> a
[1] "7"
> b <- as.hexmode(8)
> b
[1] "8"
> a + b
[1] "f"
> a * b
[1] "38"
のように、16進数として演算も行われます。
この この "38"(さん はち)が、10進での56(7×8の結果)になっているかどうかは、下記のようにして確認できます。
> 0x38
[1] 56
16進から10進への変換は、「0x」を付けるだけで行えるんですね。
> sprintf("%X", 0:31)
[1] "0" "1" "2" "3" "4" "5" "6" "7"
[9] "8" "9" "A" "B" "C" "D" "E" "F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"
16進といえば、色のRGB値を指定するときに使ったりしますが、その場合は "7" とか "F" ではなく "07" とか "0F" とかの形で欲しいですよね。
そういうときは、
> sprintf("%02X", 0:31)
[1] "00" "01" "02" "03" "04" "05" "06" "07"
[9] "08" "09" "0A" "0B" "0C" "0D" "0E" "0F"
[17] "10" "11" "12" "13" "14" "15" "16" "17"
[25] "18" "19" "1A" "1B" "1C" "1D" "1E" "1F"
とすればOK。
sprintfの書式を知っている人には蛇足ですが、「%02X」の意味は、
"X": 16進で
"2": 2桁で
"0": 桁が足りないときは0詰めで
という指示になります。
16進数でのRGB指定を使ってちょっと遊んでみましょう。
# まず枠だけプロット
plot( 0, 0, xlim=c(0,255), ylim=c(0,255),
type="n", xlab="R", ylab="G" )
# 16進の値を取り出すためのテーブル
h <- sprintf("%02X", 0:255)
for(r in 1:256) {
for(g in 1:256) {
col <- paste("#", h[r], h[g], "00", sep="")
points(r, g, col=col)
}
}
colオプションでRとGを変化させながらプロット |
青(B)を固定して、赤(R)と緑(G)を変化させたグラデーションができました。
また、10進から16進への変換を行う方法として、as.hexmode関数を使うというのもあります。
> as.hexmode(31)
[1] "1f"
表示結果は文字列(character)っぽいですが、実は違っていて、hexmodeという16進の型になっているみたいです。
> class(as.hexmode(31))
[1] "hexmode"
なので、
> a <- as.hexmode(7)
> a
[1] "7"
> b <- as.hexmode(8)
> b
[1] "8"
> a + b
[1] "f"
> a * b
[1] "38"
のように、16進数として演算も行われます。
この この "38"(さん はち)が、10進での56(7×8の結果)になっているかどうかは、下記のようにして確認できます。
> 0x38
[1] 56
16進から10進への変換は、「0x」を付けるだけで行えるんですね。
コメント
コメントを投稿