R 解码十六进制表示的字符串
在R中,将十六进制编码的字符串(如R 解码十六进制表示的字符串,r,string,R,String,在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(he
“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
}
虽然上面的代码可以工作,但使用了大量的字符串连接,效率很低
因此,问题是如何编写一个惯用、高效的R函数来执行此操作
编辑:我的示例仅适用于ASCII编码,不适用于UTF-8编码的字节数组。修改您的代码,使其使用示例进行编码。您的查找表将有255个值。把它们放在向量中,从向量中得到它们的值
不:如果您需要进行大量转换,则没有其他解决方案可以击败此解决方案。测试此解决方案是否更有效(对于更长的字符串):
<代码> String
如果您不想使用查找表(或者像CooGoLoffing::)),请考虑编写一个向量化版本,比如:
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=''))
(+1)虽然我认为你应该把它转换成一个函数,否则很难正确使用它,但是你比我快了90秒,并且写了一个更干净的实现@戴维达伦堡当然,这里的很多答案都是这样。这是留给读者的练习,我可以吗?我晚上睡不着了。我试过了,不过用
sapply
!=矢量化。@Roland我草率的语法——我想写一个用sapply
执行的任务的矢量化版本,谢谢。在摆弄了你的答案之后,这就起作用了:intToUtf8(strtoi(sapply(1:(nchar(string)/2),函数(j)paste0(unlist(strsplit(string))[(2*j-1:(2*j)],sep='',collapse='',base=16))
。
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"
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=''))
sapply(1:(nchar(foo)/2) function(j) substr(foo,(2*j-1),(2*j)))