【问题标题】:Converting hex string to a 64-bit integer/timestamp using R使用 R 将十六进制字符串转换为 64 位整数/时间戳
【发布时间】:2020-08-05 21:05:53
【问题描述】:

我需要从二进制文件中读取 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 的参数。即,这会产生一个错误(嗯,一个 NA。不是数字...):

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

谁能指出我的解决方案? TIA, 米康西定

【问题讨论】:

标签: r 64-bit


【解决方案1】:

如果你的十六进制数是正数(最高位未设置):

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

当然你可以用更优雅的方式来写这个。但我希望代码是显而易见的。

【讨论】:

    【解决方案2】:

    好的,这对我的目的有用。谢谢!这是我最终得到的结果:

    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)
    

    【讨论】:

    • 我很确定它可以被矢量化
    【解决方案3】:

    第一次矢量化它(感谢你的想法):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2017-08-12
      • 2014-12-15
      相关资源
      最近更新 更多