R 如何将二进制文件转换为数据?

R 如何将二进制文件转换为数据?,r,import,binary-data,R,Import,Binary Data,我一直在尝试转换从R中的API获取的二进制数据,但它没有正确解析和转换值 以下是二进制文件的示例: 00 00 00 01 00 04 53 42 55 58 00 00 00 25 c8 42 9b cc cd 42 9c 8a 3d 42 9b b8 52 42 9c 23 d7 44 bd 5e 14 00 00 01 43 53 5c 62 40 结果应该是: SBUX 77.9 78.27 77.86 78.07 1153261076 1/2/2014 9:

我一直在尝试转换从R中的API获取的二进制数据,但它没有正确解析和转换值

以下是二进制文件的示例:

00 00 00 01 00 04 53 42 55 58 00 00 00 25 c8 42 9b cc cd 42 9c 8a 3d 42 9b b8 52 42 9c 23 d7 44 bd 5e 14 00 00 01 43 53 5c 62 40
结果应该是:

SBUX    77.9    78.27   77.86   78.07   1153261076  1/2/2014 9:30
与正确的数据类型和大小一起使用的示例代码

readBin(file2read[1:4],integer(),n=1, size=4) #Symbol Count
readBin(file2read[5:6],integer(),n=1,size=2) #Symbol length
readBin(file2read[7:10],character(),n=4) #Sympbol = SBUX
readBin(file2read[11],integer(),n=1,size=1) #Error code
readBin(file2read[12:15],integer(),n=4) #Bar Count
readBin(file2read[16:19],double(),n=4,size=4) #close
readBin(file2read[20:23],double(),n=1,size=4) #high
readBin(file2read[24:27],double(),n=1,size=4) #low
readBin(file2read[28:31],double(),n=1,size=4) #open
readBin(file2read[32:36],double(),n=1,size=4) #volume
readBin(file2read[37:44],character(),n=1,size=8) #timestamp

但它不会生成上面列出的目标结果。

确定。除了日期/时间,我想我已经把一切都弄清楚了。首先,这是您的二进制数据

rr<-as.raw(c(0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x53, 0x42, 0x55, 
0x58, 0x00, 0x00, 0x00, 0x25, 0xc8, 0x42, 0x9b, 0xcc, 0xcd, 0x42, 
0x9c, 0x8a, 0x3d, 0x42, 0x9b, 0xb8, 0x52, 0x42, 0x9c, 0x23, 0xd7, 
0x44, 0xbd, 0x5e, 0x14, 0x00, 0x00, 0x01, 0x43, 0x53, 0x5c, 0x62, 
0x40))

这似乎可以正确地提取数据。一个主要问题是对字符使用了
readChar
,因为当您将
readBin
与“character”一起使用时,它读取C样式的字符串,因此它包括以下
x00
readChar
不会这样做。我还必须小心地指定值的尾端,因为“big”不是我系统的默认值(我在Mac上运行)。

@thelatemail Right。如果使用数组索引,则没有内部指针跟踪您所在的位置,因此您可以四处跳转。但该值的宽度取决于前一个值。所以它应该是
readBin(rr[7:[7+strwidth-1)],“character”)
其中
strwidth
是前面的整数;但是,让r遍历整个二进制文件还有另一个问题。当我将代码放入for循环时,它会在第247行停止,我不确定原因。readBin和file(“text.bin”、“rb”)是否有某种限制?@BryanNice“stops”是什么意思?它会抛出错误吗?如何跟踪二进制文件中的行?你的循环何时完成的条件是什么?@MrFlick我使用的条数是我的迭代器限制。然而,我发现了这个问题。我使用readBin直接从API下载数据并将其保存到文件中。我将其更改为使用download.file()方法,解决了这个问题。谢谢你的帮助。
writeBin(rr,"test.bin")
zz <- file("test.bin", "rb")
(nrec<-readBin(zz, "integer", size=4, endian="big"))
(charsize<-readBin(zz, "integer", size=2, signed=F, endian="big"))
(symbol<-readChar(zz, charsize))
(err<-readBin(zz, "integer", size=1, signed=F))
(bcount<-readBin(zz, "integer",size=4, endian="big"))
(sclose<-readBin(zz, "double",size=4, endian="big"))
(shigh<-readBin(zz, "double",size=4, endian="big"))
(slow<-readBin(zz, "double",size=4, endian="big"))
(sopen<-readBin(zz, "double",size=4, endian="big"))
(svol<-readBin(zz, "integer",size=4, endian="big"))
(sdate<-readBin(zz, "integer",size=4, n=2, endian="big"))
#done
close(zz)
 as.POSIXct(sdate[1]*2^32/1000 + sdate[2]/1000, origin="1970-01-01")
 # [1] "2014-01-02 09:30:00 EST"