解释提供的矩阵文件的二进制格式 (*.mtx)

逆向工程 文件格式 二元诊断
2021-06-21 08:55:20

除了标头中的 2 个小端 32 位无符号整数之外,我无法确切地弄清楚这些二进制矩阵文件的格式。假设以下是一个 3x3 单位矩阵:

0300 0000 0300 0000 0000 803f 0000 0000
0000 0000 0000 0000 0000 803f 0000 0000
0000 0000 0000 0000 0000 803f 

以下是一个带有任意数字的 3x2 矩阵,我不确定其值:

0300 0000 0200 0000 0000 803f 0000 4040
0000 a040 0000 0040 0000 8040 0000 c040

基本上,是否有一种编码0000 803f可以转换为1while0000 0000转换0为每个矩阵值的值?

2个回答

您已将前四个字节正确识别为标题或矩阵形状。

如果您要删除这些形状字节并重新对齐十六进制字符串的其余部分,则识别矩阵将变得非常清晰:

0000 803f 0000 0000 0000 0000
0000 0000 0000 803f 0000 0000
0000 0000 0000 0000 0000 803f 

在这里我们可以很容易地看到,文本与单位矩阵的形状对齐,一个单元格是四个字节,并且0000 803f代表的值1

这恰好是IEEE 754编码1.0这要么是您可以通过一些经验识别出来的东西,要么是让 Python 向您展示:

In [1]: import struct

In [3]: struct.unpack('f', "0000803f".decode('hex'))
Out[3]: (1.0,)

哦,我刚刚想通了。我可以将标头后的以下 4 个字节值中的每一个解释为 little-endian 格式的 32 位有符号浮点值。0000 803f将相当于1.0f.

我在 node.js 中使用 a 确定了这一点DataView

const u = new Uint8Array(4);
const d = new DataView(u.buffer);

u[0] = 0x00;
u[1] = 0x00;
u[2] = 0x80;
u[3] = 0x3f;

// interpret 4 bytes at offset of 0 bytes as little-endian 32-bit float
// DataView.prototype.getFloat32(byteOffset[, littleEndian])
console.log(d.getFloat32(0, true));
// outputs 1