Skip to content

Instantly share code, notes, and snippets.

@wush978
Created December 3, 2012 07:08
Show Gist options
  • Save wush978/4193275 to your computer and use it in GitHub Desktop.
Save wush978/4193275 to your computer and use it in GitHub Desktop.
hex to string in R
if (require(inline) && require(Rcpp)) {
hex2str <- cxxfunction(sig=c(Rinput="character"), plugin="Rcpp", body='
int hex2bintab[] = {
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
};
std::string src(as<std::string>(Rinput));
if (src.size() % 2) {
throw std::invalid_argument("hex_decode: the input is not a valid hex code");
}
std::string retval;
retval.resize(src.size()/2);
unsigned char *pretval( reinterpret_cast<unsigned char*>(&retval[0]) );
const unsigned char *psrc( reinterpret_cast<const unsigned char*>(&src[0]) );
int first, second;
for (size_t i = 0; i < src.size()/2; i++) {
first = hex2bintab[*psrc++];
if (first == -1) {
throw std::invalid_argument("hex_decode: the input is not a valid hex code");
}
second = hex2bintab[*psrc++];
if (second == -1) {
throw std::invalid_argument("hex_decode: the input is not a valid hex code");
}
first = first << 4;
*pretval++ = first + second;
}
return wrap<std::string>(retval);
')
} else {
hex2str <- function(src) {
hex2bintab <- c(
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
hex.number <- matrix(hex2bintab[as.integer(sapply(strsplit(src,"")[[1]], function(a) charToRaw(a)))+1], byrow=TRUE, ncol=2)
rawToChar(as.raw(hex.number[,1] * 16 + hex.number[,2]))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment