如何在R中将十六进制字符串转换为文本?

pzfprimi  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(198)

R中有没有一个函数可以将十六进制字符串转换为文本?
例如:
我有十六进制字符串1271763355662E324375203137,应该转换为qv3Uf.2Cu 17
有人知道R的好解吗?

s1ag04yj

s1ag04yj1#

这里有一个方法:

s <- '1271763355662E324375203137'
h <- sapply(seq(1, nchar(s), by=2), function(x) substr(s, x, x+1))
rawToChar(as.raw(strtoi(h, 16L)))

## [1] "\022qv3Uf.2Cu 17"

如果需要,可以sub输出不可打印的字符,如下所示:

gsub('[^[:print:]]+', '', rawToChar(as.raw(strtoi(h, 16L))))

## [1] "qv3Uf.2Cu 17"
wj8zmpe1

wj8zmpe12#

只是为了补充或简化@jbaums的答案

library(wkb)

hex_string <- '231458716E234987'

hex_raw <- wkb::hex2raw(hex_string)

text <- rawToChar(as.raw(strtoi(hex_raw, 16L)))
jyztefdp

jyztefdp3#

将所涉及的两个部分分开的替代方法:
1.将初始字符串转换为字节向量(值为十六进制)
1.将这些原始字节转换为字符(不包括任何不可打印的字符)
第一部分:

s <- '1271763355662E324375203137'
sc <- unlist(strsplit(s, ""))
i1 <- (1:nchar(s)) %% 2 == 1
# vector of bytes (as character)
s_pairs1 <- paste0(sc[i1], sc[!i1])
# make explicit it is a series of hexadecimals bytes
s_pairs2 <- paste0("0x", s_pairs1)
head(s_pairs2)
#> [1] "0x12" "0x71" "0x76" "0x33" "0x55" "0x66"

第二部分:

s_raw1 <- as.raw(s_pairs2) 
# filter non printable values (ascii < 32 = 0x20)
s_raw2 <- s_raw1[s_raw1 >= as.raw("0x20")]
rawToChar(s_raw2)
#> [1] "qv3Uf.2Cu 17"

我们还可以使用as.hexmode()函数将s_pairs1转换为十六进制向量

s_pairs2 <-  as.hexmode(s_pairs1)
head(s_pairs2)
#> [1] "12" "71" "76" "33" "55" "66"

reprex package(v2.0.1)于2023年1月3日创建

相关问题