在Matlab中将struct对象转换为二进制文件?

时间:2013-04-11 03:57:17

标签: unit-testing matlab

我需要获得用于测试的结构的二进制表示。 struct对象可以类似于下面的

a = 

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

我需要这样的东西

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

我需要获取二进制或等效的表示,例如uint64以进行测试。

如何将struct对象转换为可以与assert轻松比较的内容?

3 个答案:

答案 0 :(得分:3)

struct2bin转换器的问题在于无法唯一地回答将其转换为什么的问题。例如,您在那里的'const'字段包含一个双精度数字,其值为1。该double已消耗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'))

但实际上,为什么你想要在地球上? :)

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

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