我有以下代码从文件中获取像素值。我在运行OS X的英特尔Macbook上。我相信这是小端的。我有以下代码用于确定是否在像素上设置了最低有效位。它编译并运行,但我不确定操作是否真的给了我正确的数据。
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));
答案 0 :(得分:7)
Little-endian和big-endian是指较大单位(如short
或int
)的字节顺序(不是位,本身)。
按位运算是相同的;操作在pixels[i].blue
等中为您提供最不重要的数字。如果它们存储在char
(或unsigned char
或signed char
)中,则没有问题。如果它们存储在int
或short
或其他内容中,那么正在寻址的字节将根据机器是big-endian还是little-endian而有所不同,但它仍然是最不重要的平台上的一点数字。
答案 1 :(得分:5)
Endianess是影响值存储的内部细节。它对计算的值的方式没有影响。
答案 2 :(得分:2)
乔纳森已经有了正确的答案......只是添加一个例子。
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