当前位置: 首页 > 知识库问答 >
问题:

如何解码压缩的二进制文件。使用python从LTspice获取原始文件

罗翰
2023-03-14

我正试着从中阅读。原始文件。在LTSPice的控制面板中,可以在ASCII和二进制压缩之间切换。ASCII是可读的,没有问题,但它在大小和性能上都有缺点,这就是我想使用二进制压缩的原因。有可能选择二阶压缩,这就是目标。LTSpice作为输出。原始文件和ASCII文件都有电压和电流值,但在二进制文件中,有些符号我无法解码。

首先,我试图打开。Notpad显示在左下角UTF-8当我打开ASCII。原始文件和UCS-2小端当打开二进制解压。原始文件。我尝试了不同的编码,如UTF-16le,ISO-8859-1...

import codecs
print(dir(codecs))

而且,我试着不用BOM。我发现了这个,但没有给我任何结果:

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))

对于len(数据),我总是得到0。

我找到了这个脚本,但是没有二进制的实现。原始文件解码:http://www2.ee.unsw.edu.au/~tlehmann/ltspy。py
此外,我还找到了用于Matlab的解决方案,Paul Wagner的ltspice 2Matlab(用于Matlab的ltspice阅读器),但我需要用于python的解决方案,从该特定脚本中,我找不到使用哪种编码。我发现对于二进制解压缩文件,Paul Wagner使用插值获得更多点,然后转换为可读格式。

实际上,我用这段代码来读取。原始文件:

data = fo.read() # Binary data read
fo.close()
line = str(data, encoding='utf-16le')
print(line)

当我使用ASCII时。原始文件和UTF8,然后我有文本在最后,但当我使用二进制压缩。原始文件我找不到如何以可读格式解码文件。

这是我目前从LTSpice(文本"二进制:"后)的。

栋㲚朎㲚鸞㕼鸞㕼鸞땼䕘퇠≄뻕襾㷨⁄㷨⡜㚾⡜㚾⡜뚾䕘퇠≄㻥䏨㹔ᙘ㹓㜬㜬뜬岓逇Ⳡ㻵◲㻇㯋㻃㞟㞟랟ጟ箽㼄籼㼯덌㼩Ӏ㠋Ӏ㠋Ӏ렋괄蝄㼎ڕ㽦럍㽢먵㠹먵㠹먵령귴脍侧㼑з㽴鍰㽲럜㡆럜㡆럜롆쵺튆㼒㽺땺㽹迀㡌迀㡌迀롌偵姏䰦㼔㽾枎㽽雈㡏雈㡏雈롏䰼ᬇⅤ㼖쵅㽿ᦊ㽾⢖㡐⢖㡐⢖롐暾좳죯㼗챭㽼錒㽺䕈㡍䕈㡍䕈롍얳✀礦㼚嘻㽰㽫㿃㡁㿃㡁㿃롁먬쬥㼞㽉뙵㽁낁㠞낁㠞낁렞袨�봜㼢睿㻔瘵㻄㞠㞠랠嘈䆬흞㼦㷧븥譻븠蒱뜃蒱뜃蒱㜃빝袏噥㼪뼝뼙㼆럼㼆럼㼆㟼玵嬆㼬ﵠ뽐】뽏멬렩멬렩멬㠩떋Ҕ덭㼭葔뽩뽨챢렾챢렾챢㠾넼ꧼ㼮쏐뽵뼃뽵傴롉傴롉傴㡉뮷惵㼯툡뽻뽻婇롎婇롎婇㡎�ﶻሣ㼰姢뽿ᚶ뽿롐롐㡐誔

我希望解码并阅读这些,我想我应该得到与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

我将感谢任何帮助。目标是读取压缩的二进制文件。原始文件。

共有2个答案

管弘
2023-03-14

的标题。来自LTSpice的原始二进制文件可以用UTF-16解码。如果试图转换一个完整的二进制原始文件,那么只有头文件将被转换为文本。最后使用UTF-16成功转换为文本的字符为“二进制:”。在这之后,你应该得到“中国符号”或其他不可读的东西。

我使用了一个十六进制编辑器,比较了同一电路的原始ASCII文件和原始二进制文件。在ASCII文件中,可以找到“value:”而不是“Binary:”,然后是十进制值。因此,在十六进制编辑器的帮助下,可以比较二进制代码和原始ASCII文件中的实际值。

经过比较,我成功解码了一个RAW二进制文件。下面写的一切都是十六进制的。我有6个变量。这适用于域:直流扫描、直流运算、瞬态和直流传输(对于交流分析和噪声总是2 x 8字节双精度解码)。

  1. 在二进制:之后,总是有3个字节:00 0A 00(0A-行提要);
  2. 然后有8个字节,如果将其转换为双精度,则给出正确的值;
  3. 然后我有4个字节,如果一个转换为单精度,它会给出正确的值
  4. 给出一个值的4个字节重复5次(我有6个变量-标题"No.变量:")
  5. 重复点2、3和4,直到标题中的数字为No.积分:“满意。

我用的是LTXVII。此外,我还使用了HxD十六进制编辑器https://mh-nexus.de/en/hxd/

编辑:非常重要:字节顺序是小尾端<这意味着对于十六进制-AA 77 B8 A2中的字节顺序,它应该以相反的顺序转换为-A2 B8 77 AA。因此,AA 77 B8 A2十进制转换的单精度(浮点32)为-2.2e-13,A2 B8 77 AA十进制转换的单精度为-5e-18。

陆野
2023-03-14

打开ASCII时,Notpad显示在左下角的UTF-8中。打开二进制解压缩时的原始文件和UCS-2小尾端。原始文件。"

这很正常,UTF-8是一种文本编码,它只是将字节序列关联到某个字符。原始二进制文件没有固定的结构或编码,因为它们包含二进制数据:例如,想想字符串"3.1415926535"(UTF-8中为12个字节)和原始浮点二进制表示之间的区别该值(适合4个字节)。如果您将浮点数的“原始”4个字节解释为文本,您要么会得到一些垃圾文本输出,要么会得到一个Unicode解码错误。对于原始文件,特定的数据格式和每个字节的含义由生成它们的软件指定。

通常,您应该查找LTSpice原始文件规范,了解数据是如何排列的,并为此编写一个解析器。但是因为这是python,有人已经为你做了,并且制作了一个可以通过pip安装的包,查找这个包及其示例,它应该非常简单易用。

在这个链接上,他们表示原始二进制格式没有正式披露,可能随时都会改变(尽管过去15年来一直没有)。

格式本身是一个UTF-16头,后跟原始二进制数据。当你说:

这就是我目前所拥有的。来自LTSpice的原始文件(在文本“Binary:”)之后:[……]

这是原始数据(在UTF-16解码,正如你所看到的,在文本中是无意义的)。原始数据是变量值的压缩列表,按照标题中定义的顺序排列,重复数据中的时间点。时间是用双精度(即8字节)编码的,其他任何东西——除非你强迫它也用双精度——都是浮点数(4字节)。那么,你应该做的是:

1) 解析变量列表并计算一条记录的长度(例如,8个4*num\u的变量)

2) 从“二进制”字符串中提取字节数据,直到文件结束,并将其拆分为步骤1中获得的长度的块

3) 相应地解释记录中的字节

 类似资料:
  • 问题内容: 如果文件是A ,我可以解压缩文件,如果文件类型是I,则可以解压缩文件。我如何使用python 2.7进行此工作? 问题答案: 试试这个包:

  • 问题内容: 我很难弄清楚如何使用2.4解压缩zip文件。不包含在2.4中。我只能在服务器上使用2.4.4。 有人可以提供一个简单的代码示例吗? 问题答案: 您必须使用和。考虑目录的样本

  • 问题内容: 我正在尝试使用Python解压缩* .Z文件。我通过FTP(二进制模式)下载了它。该文件使用7zip成功解压缩(文件上的“信息”表示其类型为“ Z”)。原始文件位于ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z。 我已经阅读了Python中zlib模块的用法,并使用了一些测试代码: 执行此操作时,将得到以下输出: z

  • 难道不应该从它的二进制文件中获得源代码吗?既然编译是将高级语言(源代码)转换为低级语言(机器代码)的过程,难道我们不能为了获得源代码而直接反转这个过程吗?如果没有,为什么?

  • 我有一些pdf文件,使用pdfbox我已经将它们转换为文本并存储到文本文件中,现在我要从文本文件中删除它们 超链接 我希望按如下方式逐行获取有效文本: 我们提出了一种从纯文本中提取的多词概念词进行本体学习的方法OntoGain。OntoGain遵循一个由不同处理层定义的本体学习过程。在普通术语提取的基础上,通过对提取的概念进行聚类,形成概念层次结构。然后,衍生术语“分类法”将丰富非分类关系。已经研

  • 本文向大家介绍Python压缩解压缩zip文件及破解zip文件密码的方法,包括了Python压缩解压缩zip文件及破解zip文件密码的方法的使用技巧和注意事项,需要的朋友参考一下 python 的 zipfile 提供了非常便捷的方法来压缩和解压 zip 文件。 例如,在py脚本所在目录中,有如下文件: 将 readability 目录中的文件压缩到脚本所在目录的 readability.zip

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 问题内容: 我正在尝试从文件夹中包含在项目中的原始文件获取。但是无论如何,我都会得到一个。 该文件是一个文件,也尝试过使用,也不起作用。使用DOES 播放两个文件都可以。 的回报: 我的代码: 错误: 问题答案: 尝试这种方法,用作您的inputStream。沿着这个地方: 返回一个InputStream 编辑:如果您使用上述方法,请删除这些代码 希望这有帮助,祝你好运!^^