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

在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
}
虽然上面的代码可以工作,但使用了大量的字符串连接,效率很低

因此,问题是如何编写一个惯用、高效的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)))