我有以下代码,它从文件中获取像素值。我在运行OS X的英特尔macbook上。我相信这是小端序。我有下面的代码,我正在使用它来确定是否在像素上设置了最低有效位。它编译并运行,但我不确定by操作是否真的给了我正确的数据。
typedef struct {
unsigned char blue;
unsigned char green;
unsigned char red;
} pixel_t;
pixel_t *pixels = malloc(((bmp->dib.bmp_bytesz/3)+1) * sizeof(*pixels));
printf("%u", (pixels[i].red & 0x01));
printf("%u", (pixels[i].green & 0x01));
printf("%u", (pixels[i].blue & 0x01));
小端和大端是指以较大单位(如short
或int
)表示的字节(而不是位本身)的顺序。
按位操作是相同的;操作会在pixels[i].blue
等中为您提供数字的最低有效位。如果它们存储在char
(或unsigned char
或signed char
)中,则没有问题。如果它们存储在int
或short
或其他文件中,则根据机器是大端序还是小端序,被寻址的字节将有所不同,但它仍然是平台上数字的最低有效位。
Endianess是影响值存储方式的内部细节。它对值的计算方式没有影响。
Jonathan已经有了正确的答案。。。只是添加了一个示例。
Endianness描述了多字节数据是如何存储在计算机内存中的。它描述了地址的最高有效字节(MSB)和最低有效字节(LSB)在内存中的位置。Big Endian:首先存储MSB,即从左到右Little Endian:先存储LSB,即从右到左。
示例:0x04030201是如何存储在内存中的?
Address BE LE
00000000 04 01
00000001 03 02
00000002 02 03
00000003 01 04