【问题标题】:reading and converting binary raw data with R使用 R 读取和转换二进制原始数据
【发布时间】:2014-06-19 07:51:12
【问题描述】:

我有一个file,其中包含原始/二进制数据和 ascii。 它包含一个时间戳和一个代表速度的无符号 16 位值。 我想用“R”绘制那个速度,因此读取那个文件。

文件的定义是:

自午夜以来的毫秒数 - 在 ascii 中
+ ':$'
+ 缓冲区
+ #13#10

BufferString 然后包含我想提取的以下信息:

字节 3:序列字(无符号)
字节 4 和 5:速度(无符号)
...

我想生成一个包含 2 列时间和速度的表

我的方法是将文件作为 csv 读取一次以获取时间戳列。

library(bit)
dataPath="rawdata.txt"
#to create time col read file as csv:
rwch=read.csv(dataPath, sep=":")

然后以二进制形式再次读取文件。 我将文件分成 27 个字节的片段,这是一行的长度。

#read binary
to.read = file(path, "rb")
rw=readBin(to.read, what="raw", n = 100*27, endian = "big")
rws=split(rw, ceiling(seq_along(rw)/27))

但后来我卡住了。结果向量不包含原始数据,我无法再次拆分它以从中获取速度。 我尝试了几个函数,例如 hexView ,readRaw ,但我无法生成我的列表。

我很高兴有任何提示

【问题讨论】:

    标签: r parsing binary hex


    【解决方案1】:

    最好在您正在处理的连接上使用 readBin(),而不是尝试读取整个文件(除非文件中只有一个 data.type,但这里您有混合类型)。这似乎适用于您的示例文件。

    N<-28
    RC<-27
    secs<-numeric(N)
    speeds<-numeric(N)
    con<-file("/rawdata.txt", "rb")
    for(i in seq.int(N)) {
        print(i)
        secs[i] <- as.numeric(readChar(con,8))
        stopifnot(readChar(con,2)==":$") #check
        readBin(con,"raw",3) #skip 3 bytes
        speeds[i] <- readBin(con, "int",1,2, signed=F)
        readBin(con,"raw",10) #skip 10 bytes
        stopifnot(readBin(con,"raw",2)==c(13,10)) #check
    }
    data.frame(secs,speeds)
    close(con)
    

    【讨论】:

    • 非常感谢。我现在有一个漂亮的速度曲线。
    • 只是一个小的修正。我不得不跳过 2 个字节,因为第 3 个字节已经包含我的数据。但据我所知,附件中不包含 Speed。
    • 这是有道理的。我认为测试文件中的速度值看起来有点奇怪。
    猜你喜欢
    • 2011-05-29
    • 2016-11-02
    • 2012-11-18
    • 2018-02-05
    • 2023-03-12
    • 2020-05-13
    • 2016-02-02
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多