以十六进制表示形式解码字符串

时间:2014-12-03 12:54:25

标签: 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(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编码的字节数组。

3 个答案:

答案 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)))