除了标头中的2个little-endian 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矩阵,具有任意数字,其值我不确定: br />
0300 0000 0200 0000 0000 803f 0000 4040
0000 a040 0000 0040 0000 8040 0000 c040


基本上,是否存在一种编码方式,其中0000 803f可以转换为1的值,而0000 0000可以转换为每个矩阵值的0

#1 楼

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

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

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


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

这恰好是1.0的IEEE 754编码。这是您可以通过一些经验认识到的东西,或者让python向您展示了:

评论


请注意,此代码隐式取决于主机系统的字节序和大小。要始终解码低位字节的binary32浮点数,请使用格式字符串'
–类风湿
16年11月12日在20:50



@Rhymoid +1但是我假设写文件的代码也执行本机操作,所以@f是您想要的。

– NirIzr
16年11月12日在21:27



#2 楼

哦,我才知道。我可以将标头后的以下4个字节值分别解释为little-endian格式的32位带符号浮点值。 0000 803f等同于1.0f

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

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


评论


是。我只是在回答:(

– NirIzr
16-11-12在19:53



@NirIzr对此感到抱歉。这些文件是用于课堂作业的,我的教授没有费心解释文件的格式。您可能会回答完,我会为您打扰。

–帕特里克·罗伯茨(Patrick Roberts)
16年11月12日19:54



是的,我还是要回答,只是丢了010editor彩色图像:P

– NirIzr
16年11月12日在20:01