Я пытаюсь воссоздать скрипт Matlab, который читает двоичный файл в R или python. Вот ссылка на данные test.bin: https://github.com/AndrewHFarkas/BinaryReadTest
Matlab
FilePath = 'test.bin'
fid=fopen(FilePath,'r','b');
VersionStr=fread(fid,7,'char')
Version=fread(fid,1,'int16')
SizeFormat='float32'
DataFormat='float32'
EegMegStatus=fread(fid,1,SizeFormat)
NChanExtra=fread(fid,1,SizeFormat)
TrigPoint=fread(fid,1,'float32')
DataTypeVal=fread(fid,1,'float32')
TmpSize=fread(fid,2,SizeFormat)
AvgMat=fread(fid,1,DataFormat)
Выход Matlab:
VersionStr =
86
101
114
115
105
111
110
Version =
8
SizeFormat =
'float32'
DataFormat =
'float32'
EegMegStatus =
1
NChanExtra =
0
TrigPoint =
1
DataTypeVal =
0
TmpSize =
65
1076
AvgMat =
-12.9650
This моя самая близкая попытка с python (я нашел этот код из другого ответа stackoverflow:
import numpy as np
import array
def fread(fid, nelements, dtype):
if dtype is np.str:
dt = np.uint8 # WARNING: assuming 8-bit ASCII for np.str!
else:
dt = dtype
data_array = np.fromfile(fid, dt, nelements)
data_array.shape = (nelements, 1)
return data_array
fid = open('test.bin', 'rb');
print(fread(fid, 7, np.str)) # so far so good!
[[ 86]
[101]
[114]
[115]
[105]
[111]
[110]]
#both of these options return 2048
print(fread(fid, 1, np.int16))
np.fromfile(fid, np.int16, 1)
И независимо от того, что еще я пробовал, я не могу получить одно и то же число после Я попытался использовать маленькие и большие порядковые настройки, но, возможно, не правильно.
Если это поможет, вот моя ближайшая попытка в R:
newdata = file("test.bin", "rb")
version_char = readBin(newdata, "character", n=1)
version_char
[1] "Version" # this makes sense because the first 7 bytes to spell Version
version_num = readBin(newdata, "int", size = 1 , n = 1, endian = "little")
version_num
[1] 8 #correct number
И ничего после этого не совпадает Это то, где я действительно запутался, потому что мне удалось получить только 8 с (байтовым) размером = 1 для version_num, но насколько я понимаю, int16 должен составлять два байта. Я попробовал этот код ниже, чтобы прочитать в поплавок, как предлагается в другом сообщении:
readBin(newdata, "double", size = 4 , n = 1, endian = "little")
Спасибо всем за ваше время