如何从R中的hex得到32位小端值?

hs1rzwqc  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(139)

我有一个数据文件,字节17:20中包含以下十六进制值
九十二○二○ ○ ○
根据https://hexed.it/,这些字节的32位整数(有符号或无符号)是658。如何从这些原始值中获得值658?注意,这是Little-endian排序。

> readBin(img_path, "raw", 20)[17:20]
[1] 92 02 00 00

ajsxfq5m

ajsxfq5m1#

如果以字符形式读取文件,则可以使用strtoi

hex_to_int = function(x) {
  i = 256^(0:(length(x)-1)) * strtoi(x, base = 16L)
  sum(i)
}

x  = c("92", "02", "00", "00")
hex_to_int(x)
# [1] 658
jgwigjjp

jgwigjjp2#

如果你有一个原始向量,你可以使用readBin转换成整数。

x <- as.raw(c(146, 2, 0, 0))
x
# [1] 92 02 00 00
readBin(x, integer(), n=1, size=4, endian = "little")
# [1] 658
xytpbqjk

xytpbqjk3#

其中一种方法是手动操作:

get_32bit_unsigned <- function(raw_32bit) {
  if(!( inherits(raw_32bit, 'raw') & length(raw_32bit) == 4)) {
    rlang::abort('raw_32bit must be a 32-bit raw vector')
  }
  width_in_bits = rawToBits(raw_32bit)
  v = 0
  for(i in 1:length(width_in_bits)) {
    v = v + 2^(i-1)*as.integer(width_in_bits[i])
  }
  return(v)
}

get_32bit_unsigned(readBin(img_path, "raw", 20)[17:20])
> 658

相关问题