<SOLVED> Преобразование шестнадцатеричной строки в 64-битное целое число / метку времени с помощью R - PullRequest
1 голос
/ 06 августа 2020

Мне нужно прочитать 8 байтов из двоичного файла и преобразовать его в метку времени. Получить данные в массив символов несложно. Я получаю

DateTime <- as.raw(c(0x11, 0x77, 0x84, 0x43, 0xe6, 0x11, 0xd8, 0x08))

Формат данных - endian = "little", поэтому, если я переверну этот массив, я могу получить строку, которая представляет число в шестнадцатеричном формате

paste(rev(DateTime),collapse="")

, что дает "08d811e643847711"

Используя пакет bit64, я хотел бы иметь возможность использовать этот

x <- as.integer64(0x8d811e643847711)

, но я не могу понять, как получить указанную выше строку для использования в качестве аргумента as.integer64. Ie, это генерирует ошибку (ну, NA. Не число ...):

x <- as.integer64(paste(rev(DateTime),collapse=""))

Может ли кто-нибудь указать мне решение? ТИА, мконсидин

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Хорошо, это сработает для моих целей. Спасибо! Вот что у меня получилось:

alongint <- function(hexarray){
  datain <- as.integer(hexarray)
  x <- datain[1]+datain[2]*256+datain[3]*256^2+datain[4]*256^3+
    datain[5]*256^4+datain[6]*256^5+datain[7]*256^6+datain[8]*256^7
  return(x)  
}

DateTime <- readBin(SERfile,"raw",size=1,8,endian="little")

x <- alongint(DateTime)
0 голосов
/ 07 августа 2020

Первый способ векторизации (спасибо за идею):

xtoy <- function(a,b){
  return(a*256^b)
}

vxtoy <- Vectorize(xtoy,c("a","b"))
sum(vxtoy(as.integer(DateTime),c(0,1,2,3,4,5,6,7)))
0 голосов
/ 06 августа 2020

Если ваше шестнадцатеричное число положительное (самый верхний бит не установлен):

require(bit64)

DateTime <- as.raw(c(0x11, 0x77, 0x84, 0x43, 0xe6, 0x11, 0xd8, 0x08))

x <- as.integer64('0')
x <- 256 * x + as.integer(DateTime[1])
x <- 256 * x + as.integer(DateTime[2])
x <- 256 * x + as.integer(DateTime[3])
x <- 256 * x + as.integer(DateTime[4])
x <- 256 * x + as.integer(DateTime[5])
x <- 256 * x + as.integer(DateTime[6])
x <- 256 * x + as.integer(DateTime[7])
x <- 256 * x + as.integer(DateTime[8])
x

Конечно, вы можете написать это более элегантно. Но я хотел, чтобы код был очевиден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...