我需要获取结构的二进制表示以进行测试。结构对象可以如下所示
a =
const: 1
terms: {[1x1 struct] [1x1 struct]}
我需要这样的东西
assert(struct2bin64(a)=='3g439acahplrhph24'))
我需要在哪里获得二进制或等效表示,例如 uint64 进行测试。
如何将结构对象转换为可以轻松与断言进行比较的东西?
我需要获取结构的二进制表示以进行测试。结构对象可以如下所示
a =
const: 1
terms: {[1x1 struct] [1x1 struct]}
我需要这样的东西
assert(struct2bin64(a)=='3g439acahplrhph24'))
我需要在哪里获得二进制或等效表示,例如 uint64 进行测试。
如何将结构对象转换为可以轻松与断言进行比较的东西?
转换器的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)}}))...
);
例如,明确地重新创建您想要的确切结构的匿名副本?
如果您坚持以复杂的方式进行操作,则可以在文件交换中使用此提交,它允许您将字符串转换为 base64。然后使用我自己的一个提交toString,它将任何内容转换为字符串,包括结构。有了这些,你可以做到
assert(strcmp(base64encode(toString(a)), 'your_pre-generated_base64_string'))
但说真的,你到底为什么要这么做?:)
您可以将结构保存到文件中 - 这是 Matlab 向您展示(压缩)二进制表示的方式。如果您已经在内存中加载了“参考文件”,则可以保存该文件,将其读取为二进制文件并进行比较。
referenceStruct = struct( 'field1', val1, 'field2', etc);
save('ref.mat', 'referenceStruct');
fid = fopen('ref.mat', 'rb');
refBinary = fread(fid, inf, 'uint8');
fclose(fid);
现在您将二进制值转换为可以适合 ASCII 的值,例如使用这些例程。
但我必须同意罗迪的观点——为什么要这么麻烦?这太可怕了。您可以创建参考结构,使用 进行测试isequal
,然后完成。当然,我们甚至没有谈论比较double
类型是否相等的危险......这是另一个时间和另一个问题。
R2013a 中包含在 MATLAB 中的单元测试框架包含递归比较结构数组的能力。这个解决方案比使用 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
>>
有了这种额外的严格性,我认为不需要将结构转换为二进制,在这种情况下,您将失去任何进行有意义诊断的机会。