Я знаю, что эта ветка уже немного устарела, но мне нужно было недавно прочитать файлы SPA, и я хотел бы поделиться тем, как мне удалось с ними справиться.
Как заявляет cooooldog, смещение 0x41c не является стандартным. Однако это смещение закодировано в самом файле spa.
При редактировании файла спа в начале появляется короткий заголовок, а затем множество нулей. От 0x11e ненулевые значения.
Вот как мне удалось найти правильное смещение для моих спектральных файлов:
Начиная с 0x11e, я начинаю читать значения int32. Похоже, что смещение данных кодируется непосредственно перед этим значением: 54 18 00 00 (что составляет 6228 в десятичном виде).
Редактировать: я получил новый набор файлов спа, где искомый шаблон больше не 54 18 00 00, а 40 61 00 00 (24896), так что это может быть не стандартным. Фактически, кажется, что начальный адрес кодируется в 172 или 182 часа в файле спа. Мне все еще нужен способ выяснить это.
Таким образом, при поиске 6228 смещение, необходимое для поиска данных позже в файле, представляет собой целое число, найденное непосредственно перед этим значением 6228.
Если вы продолжите редактирование своего файла spa, вы должны найти значения с плавающей запятой в 32-битной кодировке, расположенные сразу после набора текста.
Теперь можно читать эти значения, просто заменив 0x41c на найденный адрес.
Если это может кому-нибудь помочь ...
function address = getStart(filename)
try
% Open the file
fid=fopen(filename,'r');
% Jump where the values become interesting
fseek(fid,hex2dec('11e'),'bof');
% Pattern we're looking for
pattern = 6228;
suspect = 0;
while suspect~=pattern
oldSuspect = suspect;
suspect = fread(fid,1,'int32');
end
% The correct address is just before our current suspect
address = oldSuspect;
% Close the file
fclose(fid);
catch ex
address = 0;
disp(ex)
end