在R中,将以十六进制编码的字符串(例如"40414243"
)转换为其等效字符的有效方法是什么? "@ABC"
?
例如,相当于这段代码:
library(stringr)
FromHexString <- function (hex.string) {
result <- ""
length <- str_length(hex.string)
for (i in seq(1, length, by=2)) {
hex.value <- str_sub(hex.string, i, i + 1)
char.code <- strtoi(hex.value, 16)
char <- rawToChar(as.raw(char.code))
result <- paste(result, char, sep="")
char
}
result
}
产生:
> FromHexString("40414243")
[1] "@ABC"
虽然上面的代码有效,但使用大量的字符串连接根本没有效率。
所以问题是如何编写执行此操作的惯用,高效的R函数。
编辑:我的示例仅适用于ASCII编码,而不适用于UTF-8编码的字节数组。
答案 0 :(得分:4)
测试是否更有效(对于更长的字符串):
string <- "40414243"
intToUtf8(
strtoi(
do.call(
paste0,
as.data.frame(
matrix(
strsplit(string, split = "")[[1]],
ncol=2,
byrow=TRUE),
stringsAsFactors=FALSE)),
base=16L)
)
#[1] "@ABC"
否则你可以寻找C / C ++实现。
答案 1 :(得分:1)
修改您的代码,以便lookup tables使用R here作为{{3}}的示例。您的查找表将包含255个值。将它们放在矢量中并从该矢量中获取它们的值。
不是:如果你需要做很多转换,没有其他解决方案可以胜过这个。
答案 2 :(得分:1)
如果您不想使用查找表(或者像codegolfing :-)),请考虑编写以下内容的矢量化版本:
bar <- unlist(strsplit(foo,'')) #separates input into individual elements
items <- sapply(1:(length(bar)/2),function(j)paste0(bar[(2*j-1):(2*j)],sep='',collapse=''))
后跟strtoi
或其他。
但更容易(我希望......)
sapply(1:(nchar(foo)/2) function(j) substr(foo,(2*j-1),(2*j)))