大端、小端、魔数等概念

今天看caffe将mnist原始的二进制数据转成lmdb格式的时候,出现了大端存储,小端存储,魔数的概念,转换数据的源文件及函数在example/mnist/convert_mnist_data.cpp中。

魔数的概念:很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。根据这几个字节的内容就可以确定文件类型,因此这几个字节的内容被称为魔数 (magic number)。

大端存储与小端存储:一个博客里面写的十分详细,总体来说:大端存储类似人的正常思维,小端存储机器处理更方便

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

mnist原始数据文件中32位的整型值是大端存储,C/C++变量是小端存储,所以读取数据的时候,需要对其进行大小端转换。

转换的函数为:

uint32_t swap_endian(uint32_t val) {
    val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
    return (val << 16) | (val >> 16);
}

举一个例子:

将一个32位的无符号整型变量(uint32)0x12345678从大端存储转成小端存储,那么转换的结果应该变为:0x78563412

上面的函数就实现了这个功能,将0x12345678带入,下面是我的演算过程:

实现了大端小端转换。

猜你喜欢

转载自blog.csdn.net/chengzhongxuyou/article/details/52779094