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

我一直在尝试转换从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))

我只是要写一个文件,以便通过readBin更容易地读取数据. (另外因为看起来符号是可变长度的,所以后面的值的指示可能不同;文件连接将跟踪下一个字节.)这里我把它写到光盘,然后打开它

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)

因此barcount变量不在您的输出中,但它的值似乎为9672.现在日期有点棘手.它存储为64位整数. R并不喜欢用readBin读取那些(至少不在我的机器上),所以我把它读作两个整数.您可以将其转换为日期

 as.POSIXct(sdate[1]*2^32/1000 + sdate[2]/1000, origin="1970-01-01")
 # [1] "2014-01-02 09:30:00 EST"

这似乎可以正确地提取数据.一个主要问题是使用readChar作为字符,因为当你使用带有“字符”的readBin时,它会读取C风格的字符串,因此它包含以下x00. readChar不这样做.我还必须小心指定值的endian-ness,因为“big”不是我系统的默认值(我在Mac上运行).

点赞