R中有没有一个函数可以将十六进制字符串转换为文本?例如:我有十六进制字符串1271763355662E324375203137,应该转换为qv3Uf.2Cu 17。有人知道R的好解吗?
1271763355662E324375203137
qv3Uf.2Cu 17
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输出不可打印的字符,如下所示:
sub
gsub('[^[:print:]]+', '', rawToChar(as.raw(strtoi(h, 16L)))) ## [1] "qv3Uf.2Cu 17"
wj8zmpe12#
只是为了补充或简化@jbaums的答案
library(wkb) hex_string <- '231458716E234987' hex_raw <- wkb::hex2raw(hex_string) text <- rawToChar(as.raw(strtoi(hex_raw, 16L)))
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转换为十六进制向量
as.hexmode()
s_pairs2 <- as.hexmode(s_pairs1) head(s_pairs2) #> [1] "12" "71" "76" "33" "55" "66"
由reprex package(v2.0.1)于2023年1月3日创建
3条答案
按热度按时间s1ag04yj1#
这里有一个方法:
如果需要,可以
sub
输出不可打印的字符,如下所示:wj8zmpe12#
只是为了补充或简化@jbaums的答案
jyztefdp3#
将所涉及的两个部分分开的替代方法:
1.将初始字符串转换为字节向量(值为十六进制)
1.将这些原始字节转换为字符(不包括任何不可打印的字符)
第一部分:
第二部分:
我们还可以使用
as.hexmode()
函数将s_pairs1转换为十六进制向量由reprex package(v2.0.1)于2023年1月3日创建