Я пытаюсь читать из .raw LTSPice файлов. На панели управления LTSPice есть возможность переключения между ASCII и двоичным сжатием. ASCII читается без проблем, но имеет недостатки в размере и производительности, и именно поэтому я хочу использовать двоичное сжатие. Есть возможность выбрать сжатие 2-го порядка, и это цель. LTSpice выдает в качестве выходных файлов .raw, а файл ASCII имеет значения напряжений и токов, но в двоичном файле есть символы, которые я не могу декодировать.
Сначала я попытался открыть файлы .raw с помощью notepad ++,Notpad ++ показывает в левом нижнем углу UTF-8, когда я открываю файлы ASCII .raw, и UCS-2 Little Endian, когда открываю двоичные распакованные файлы .raw. Я пробовал с другой кодировкой, такой как UTF-16le, ISO-8859-1 ... фактически я печатаю все кодеки и пробовал с ними:
import codecs
print(dir(codecs))
Кроме того, я пробовал без спецификации. Я нашел это, и он не дал результатов для меня:
import codecs
encoded_text = open('Circuit_binary_Transient.raw', 'rb').read() #should read in binary mode to get the BOM correctly
bom= codecs.BOM_UTF16_LE #print dir(codecs) for other encodings
assert encoded_text.startswith(bom)
encoded_text= encoded_text[len(bom):] #strip away
decoded_text= encoded_text.decode('utf-16le')
print(decoded_text)
Я обнаружил, что Zlib - обычное сжатие, и я попытался выяснить, на каких позициях в моем файле происходит сжатие, но без результатов. Я использовал:
import zlib
from glob import glob
def zipstreams(filename):
"""Return all zip streams and their positions in file."""
with open(filename, 'rb') as fh:
data = fh.read()
i = 0
while i < len(data):
try:
zo = zlib.decompressobj()
yield i, zo.decompress(data[i:])
i += len(data[i:]) - len(zo.unused_data)
except zlib.error:
i += 1
for i, data in zipstreams("Circuit_binary_Transient.raw.raw"):
print (i, len(data))
Я всегда получаю 0 для len (data).
Я нашел этот скрипт, но без реализации декодирования двоичных .raw файлов: http://www2.ee.unsw.edu.au/~tlehmann/ltspy.py
Кроме того, я нашел решение для Matlab, LTSpice2Matlab, Пола Вагнера (ltspice reader for Matlab), но оно мне нужно для python, и из этого конкретного сценария я не могу найти, какая кодировка используется. Я обнаружил, что для двоичных распакованных файлов Пол Вагнер использовал интерполяцию, чтобы получить больше точек, а затем преобразовать в читаемый формат.
На самом деле, я использовал этот код для чтения .raw файлов:
data = fo.read() # Binary data read
fo.close()
line = str(data, encoding='utf-16le')
print(line)
Когда я использовал ASCII-файлы .raw и UTF8, у меня в конце есть текст, но когда я использовал двоичные сжатые файлы .raw, я не могу найти, как декодировать файл в читаемом формате.
Это то, что у меня сейчасв файле .raw из LTSpice (после текста «Binary:»):
栋㲚朎㲚鸞㕼鸞㕼鸞땼䕘퇠≄뻕襾㷨⁄㷨⡜㚾⡜㚾⡜뚾䕘퇠≄㻥䏨㹔ᙘ㹓㜬㜬뜬岓逇Ⳡ㻵◲㻇㯋㻃㞟㞟랟ጟ箽㼄籼㼯덌㼩Ӏ㠋Ӏ㠋Ӏ렋괄蝄㼎ڕ㽦럍㽢먵㠹먵㠹먵령귴脍侧㼑з㽴鍰㽲럜㡆럜㡆럜롆쵺튆㼒㽺땺㽹迀㡌迀㡌迀롌偵姏䰦㼔㽾枎㽽雈㡏雈㡏雈롏䰼ᬇⅤ㼖쵅㽿ᦊ㽾⢖㡐⢖㡐⢖롐暾좳죯㼗챭㽼錒㽺䕈㡍䕈㡍䕈롍얳✀礦㼚嘻㽰㽫㿃㡁㿃㡁㿃롁먬쬥㼞㽉뙵㽁낁㠞낁㠞낁렞袨�봜㼢睿㻔瘵㻄㞠㞠랠嘈䆬흞㼦㷧븥譻븠蒱뜃蒱뜃蒱㜃빝袏噥㼪뼝뼙㼆럼㼆럼㼆㟼玵嬆㼬ﵠ뽐】뽏멬렩멬렩멬㠩떋Ҕ덭㼭葔뽩뽨챢렾챢렾챢㠾넼ꧼ㼮쏐뽵뼃뽵傴롉傴롉傴㡉뮷惵㼯툡뽻뽻婇롎婇롎婇㡎�ﶻሣ㼰姢뽿ᚶ뽿롐롐㡐誔
Я ожидаю декодировать и прочитать это, и я полагаю, что я должен получить то же самое, что и в файлах .raw ASCII, таких как:
0 0.000000000000000e+000
1.884843971540818e-002
1.884796850054908e-002
9.423984250366810e-007
9.423984250274539e-007
-9.423984250328532e-007
1 3.951925877448456e-008
1.959322256186405e-002
1.959271263253092e-002
9.796356316741367e-007
9.796356316265457e-007
-9.796356317259836e-007
2 1.185577763234539e-007
2.108275522427772e-002
2.108216492289399e-002
1.054108246213077e-006
1.054108246144700e-006
-1.054108246245633e-006
Буду признателен за любую помощь. Цель - прочитать сжатый двоичный файл .raw LTSpice.