Engee 文档
Notebook

读写binxml文件

在这个例子中,我们将比较在EngeeMATLAB中读取binxml格式的文件。

让我们从二进制文件(bin)开始。 它们包含一个原始数据结构,这使得它们很难在没有特殊工具的情况下解释。 这些文件由一个字节流组成,可以表示任何数据,无论是文本,图像,音频还是视频。 这些数据以二进制形式存储,这需要进行特殊处理以提取必要的信息。

使用二进制文件的主要特点如下。

  1. 数据格式:在二进制文件中,数据由字节序列表示,其中每个字节存储一个信息单元。
  2. 数据解释:理解二进制文件的内容需要了解其内部结构。 如果不了解数据结构,程序将无法正确解释文件。
  3. 通过读取和写入单个字节或字节块来访问数据。 程序必须知道解释器将如何处理这些数据。

让我们创建一个二进制文件进行读取。

In [ ]:
Pkg.add(["EzXML"])
In [ ]:
open("file.bin", "w") do io
    write(io, Int32(12))   # Запишем целое число типа Int32
    write(io, Float64(3.14))  # Запишем вещественное число типа Float64
    write(io, "Test\n")  # Запишем строку
end
Out[0]:
5

Engee中读取二进制文件:

In [ ]:
open("file.bin", "r") do io
    num_int = read(io, Int32)  # Считаем целое число типа Int32
    num_float = read(io, Float64)  # Считаем вещественное число типа Float64
    str = String(read(io))  # Считаем оставшуюся часть файла как строку

    println("Целое число: ", num_int)
    println("Вещественное число: ", num_float)
    print("Прочитанная строка: ", str)
end
Целое число: 12
Вещественное число: 3.14
Прочитанная строка: Test

MATLAB中读取二进制文件:

In [ ]:
using MATLAB
mat"""
fileID = fopen('file.bin', 'rb');
num_int = fread(fileID, 1, 'int32');
num_float = fread(fileID, 1, 'double');
str = fscanf(fileID, '%c');
fclose(fileID);
"""
Out[0]:
0.0
In [ ]:
mat"""fprintf('Прочитанные целые числа: ');
disp(num_int);"""
>> >> >> Прочитанные целые числа: >>     12

In [ ]:
mat"""fprintf('Прочитанные вещественные числа: ');
disp(num_float);"""
>> >> >> Прочитанные вещественные числа: >>     3.1400

In [ ]:
mat"""disp(['Прочитанная строка: ', str]);"""
>> >> >> Прочитанная строка: Test

虽然测试表明代码原来是相同的类型,但两种语言之间的差异表现在Engee的语法更简单,更直观。 此外,Engee中的数据类型更容易理解,因为没有"double"的概念。

现在让我们继续讨论XML文件(xml)。 它们旨在以树的形式存储结构化数据。 XML文件的每个元素都有自己的标记,该标记定义此元素中包含的数据类型。 这使得处理这些文件变得更加容易,因为程序可以分析文件结构并提取必要的数据。

使用XML文件的主要功能如下。

  1. 数据结构:XML文件是一个树,其中每个元素(标记)包含有关数据类型和结构的信息。
  2. 分层结构:XML文件以树结构组织数据,其中每个元素都有父元素和后代元素。
  3. 标记:XML文件包含定义数据组织方式的标记。 这简化了数据处理,程序知道如何处理每个元素。

读取此类文件的最简单方法是使用小写表示。 对于此类文件的详细分析,Engee具有EzXML库。 而MATLAB使用Java API来处理XML,因为没有内置的工具。

In [ ]:
Pkg.add("EzXML")
using EzXML
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using EzXML
doc = parsexml("""
<primates>
    <genus name="Homo">
        <species name="sapiens">Human</species>
    </genus>
    <genus name="Pan">
        <species name="paniscus">Bonobo</species>
        <species name="troglodytes">Chimpanzee</species>
    </genus>
</primates>
""")
# Сохраняем документ в файл
write("file.xml", doc)
Out[0]:
290

Engee中读取XML文件:

In [ ]:
open("file.xml", "r") do io
    str = String(read(io))
    println(str)
end
<?xml version="1.0" encoding="UTF-8"?>
<primates>
    <genus name="Homo">
        <species name="sapiens">Human</species>
    </genus>
    <genus name="Pan">
        <species name="paniscus">Bonobo</species>
        <species name="troglodytes">Chimpanzee</species>
    </genus>
</primates>

MATLAB中读取XML文件:

In [ ]:
mat"""
fileID = fopen('file.xml', 'rb');
disp(fscanf(fileID, '%c'));
"""
>> >> >> >> <?xml version="1.0" encoding="UTF-8"?>
<primates>
    <genus name="Homo">
        <species name="sapiens">Human</species>
    </genus>
    <genus name="Pan">
        <species name="paniscus">Bonobo</species>
        <species name="troglodytes">Chimpanzee</species>
    </genus>
</primates>

结论

在这个例子中,我们研究了二进制文件和XML文档是如何用两种编程语言编写和读取的。 从这个分析中可以看出,这个方向的句法和功能优势都在Engee的一边。