在Matlab中将结构对象转换为二进制?

Posted

技术标签:

【中文标题】在Matlab中将结构对象转换为二进制?【英文标题】:Conversing struct object into binary in Matlab? 【发布时间】:2013-04-11 03:57:16 【问题描述】:

我需要获取结构的二进制表示以进行测试。 struct 对象可以如下所示

a = 

    const: 1
    terms: [1x1 struct]  [1x1 struct]

我需要这样的东西

assert(struct2bin64(a)=='3g439acahplrhph24')) 

我需要在哪里获得二进制或等效表示,例如 uint64 进行测试。

如何将 struct 对象转换为可以轻松与 assert 进行比较的东西?

【问题讨论】:

【参考方案1】:

struct2bin 转换器的问题在于无法唯一回答将其转换为什么的问题。例如,您在那里的'const' 字段包含一个值为1 的双精度数。该双精度已消耗 64 位,因此 uint64 不足以包含该结构。

所以,我认为您的意思是 base-64 表示。在这种情况下,您会遇到类似的问题;字符串有多长?尽管您可以将结构序列化为 base-64 并将 strcmp 与预先生成的 base64 字符串进行比较,但是

assert(isequal(a, struct(...
    'const', 5,...
    'terms', struct('const', 6), struct('const' ,2.2)))...
);

例如,明确地重新创建您想要的确切结构的匿名副本?

如果您坚持以复杂的方式进行操作,您可以使用this submission on the file exchange,它允许您将字符串转换为base64。然后使用我自己的一个提交,toString,它将任何内容转换为字符串,包括结构。有了这些,你就可以做

assert(strcmp(base64encode(toString(a)), 'your_pre-generated_base64_string'))

但说真的,你到底为什么要这么做? :)

【讨论】:

我怀疑他所指的64与base64 encoding有关,而不是编码成uint64类型... @Floris:同样的问题; base64 字符串要多长时间? @Floris:加上 OP 在问题中明确提到 uint64 :)【参考方案2】:

您可以将结构保存到文件中 - 这是 Matlab 向您展示(压缩)二进制表示的方式。如果您已经在内存中加载了“参考文件”,则可以保存该文件,将其读取为二进制文件,然后进行比较。

referenceStruct = struct( 'field1', val1, 'field2', etc);
save('ref.mat', 'referenceStruct');
fid = fopen('ref.mat', 'rb');
refBinary = fread(fid, inf, 'uint8');
fclose(fid);

现在您将二进制值转换为适合 ASCII 的值,例如与these routines。

但我必须同意罗迪的观点——为什么要这么麻烦?这太可怕了。您可以创建一个参考结构,使用isequal 进行测试,然后完成。当然,我们甚至没有谈论比较 double 类型是否相等的危险......这是另一个时间和另一个问题。

【讨论】:

与此相关:***.com/a/6261884/97160(并点击 cmets 中的链接)【参考方案3】:

R2013a 的 MATLAB 中包含的 unit test framework 包含递归比较结构数组的功能。此解决方案比使用 isequal 严格得多,因为 isequal 忽略了稀疏性和类(int8 结构与双精度结构)之类的东西。例如,以下比较通过:

assert(isequal(struct('const', 5), struct('const', int8(5))));

但是,它在单元测试框架中失败了:

>> testCase = matlab.unittest.TestCase.forInteractiveUse;
>> testCase.verifyEqual(struct('const', 5), struct('const', int8(5)))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
verifyEqual failed.
--> NumericComparator failed.
    Path to failure: <Value>.const
    --> Classes do not match.

    Actual Class:
        double
    Expected Class:
        int8

Actual struct:
        const: 5
Expected struct:
        const: 5
>> 

由于这种额外的严格性,我认为不需要将结构转换为二进制,在这种情况下,您将失去任何进行有意义诊断的机会。

【讨论】:

以上是关于在Matlab中将结构对象转换为二进制?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MATLAB中将原始Unicode十六进制转换为Unicode表示

如何在javascript中将嵌套对象转换为对象数组? [关闭]

在python中将对象数据类型转换为字符串问题

在哪里定义类型转换到 MATLAB OOP 中的结构?

如何在 Flutter 中将 JSON 转换为对象? [关闭]

如何在 Python 中将字节数转换为二进制数?