首页 > 解决方案 > 如何将十六进制字符串视为R中的原始数据

问题描述

我已经将一些数据作为 blob 存储在 SQL Server 中。如果我对数据库进行直接查询,blob 列将作为原始数据(十六进制)返回,然后我可以使用这些原始数据将 blob 作为文件写入终端系统。

library(jsonlite)
library(DBI)
con <- dbConnect(odbc::odbc(), Driver = "SQL Server", Server = "localhost\\sql2019", 
    Database = "DocumentData", Trusted_Connection = "True")

blobs <- dbGetQuery(con,"select * from Blob")

str(blobs$spectra[2][[1]]) #this returns raw [1:1678544] ff d8 ff e0 ...

但是,如果我通过 web 服务执行相同的查询,十六进制数据将作为字符串返回。在这两种情况下,十六进制数字是相同的。这是示例代码:

data<-jsonlite::fromJSON("https://localhost:5001/Spectra")
str(data$spectraBLOB) #this returns chr "FFD8FFE0"| __truncated__

所以我的问题是如何将字符数组(十六进制数字)转换为原始向量,以便我可以使用十六进制原始数据在终端系统上重新创建文件。将原始数据向量保存到终端系统文件的示例代码是:

rawToJpeg <- function(pic_data) {
  f = file(paste0('c:/temp/blob_file.jpg'), "wb")
  writeBin(object = pic_data, con = f)
  close(f)
}

rawToJpeg(blobs$spectra[2][[1]])#works with raw data
rawToJpeg(data$spectraBLOB)     #does not work as expected with string of hexadecimal

任何想法我该如何解决它(或将十六进制字符串的类型更改为十六进制原始)?

标签: r

解决方案


将十六进制字符串解析为原始向量的代码:

sst <- strsplit(data$spectraBLOB, "")[[1]]
hex_string_vector <- paste0(sst[c(TRUE, FALSE)], sst[c(FALSE, TRUE)])
raw_hex_vector = as.raw(as.hexmode(hex_string_vector))

推荐阅读