我试图读取字节数组的各个位。我基本上是遍历字节数组,想知道每个位是0还是1。
我的问题是,我无法区分0和1位。代码总是将每个位读为1。
这是我的代码:
const unsigned char bitmap[] = {
0x00,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF
};
void drawBitmap(Framebuffer *fb) {
uint8_t x = 1;
for (int i = 0; i < sizeof(bitmap); ++i) {
for (int p = 0; p < 8; ++p) {
if ((bitmap[i] >> p) & 1) { // If bit
fb->drawPixel(x, 1); // **RIGHT HERE** --> I AM ALWAYS GETTING THIS AS TRUE
}
x++;
}
}
}
请注意,有些字节应该全为零(0x00)。我默认假设这些是字节(8位),对吗?任何想法为什么我无法区分1和0?
注意:这里是整个代码......我正在尝试使用这个库:https://github.com/tibounise/SSD1306-AVR和atmega328P ...这只是没有任何意义。每当我使用&#34; fb-&gt; drawPixel(x,1);&#34;在它自己的工作正常,但在这个特定的功能,我总是得到一个&#34; 1&#34; (一个像素)。
#define F_CPU 14745600
#include <stdint.h>
#include <stdio.h>
#include <math.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <util/delay.h>
//#include "SSD1306.h"
#include "Framebuffer.h"
const unsigned char bitmap[] = {
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF
};
void drawBitmap(Framebuffer *fb) {
uint8_t x = 1;
int z = 0;
for (int i = 0; i < sizeof(bitmap); ++i) {
for (int p = 0; p < 8; ++p) {
if ((bitmap[i] >> p) & 1) { // If bit
fb->drawPixel(x,1);
}
x++;
}
}
}
int main(void) {
//const uint8_t *bitmap;
//bitmap = &bitmap1;
Framebuffer fb;
Framebuffer *FB;
//Pointer to the class
FB = &fb;
//fb.drawPixel(5, 5);
drawBitmap(FB);
fb.show();
//delay_ms(1000);
return 0;
}
有什么想法吗?
提前致谢。
答案 0 :(得分:1)
您的代码似乎没问题。但是,您的样本数据以字节为单位,而不是位。
如果使用1位位图,则每像素有8位。每个位都是0
或1
(黑色或白色)。每组8位都压缩为字节:
0xFF
包含8位:"11111111"
0x00
包含8位:"00000000"
实际位图可能具有以下顺序:
"1011 0001"
使用更真实的数据尝试相同的代码:
const unsigned char bitmap[] =
{
1 | 0 | 4 | 8 | 0 | 0 | 0 | 128,//1011 0001 <- first 8-bits
0xFF, //<- second set of 8-bits
0x00, //...
};
int main(void)
{
for(int i = 0; i < sizeof(bitmap); ++i)
{
printf("%3d ", bitmap[i]);
for(int p = 0; p < 8; ++p)
printf(((bitmap[i] >> p) & 1) ? "1" : "0");
printf("\n");
}
return 0;
}
结果:
141 10110001
255 11111111
0 00000000