Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

decompose image into pixels array

Status
Not open for further replies.
BMP header is small and simple compared to some other files.
I was reading and writing it in NIOS, most of the fields are ignored or set to zero (6h, 8h, 1Eh, 2Eh,32h).

in attached example 640*480*3=921600 bytes
data comes after header which is 54 bytes so file size is 921600+54=921654 bytes

And watch for the vertical pixel count, if it is negative, it means that picture is upside down.

There is nothing else to it....
 
Hi guys,
Sorry for the delay, rough week.

misterT said:
panic mode suggested IrfanView which can view any file as a nice hex table. Try it.
https://www.irfanview.com/
This apps is great.
I'm trying to understand how to write a code which reads just the same as irfanvew reads.
Could you please help me out with it?
Thank you very much.
 
Can't put it more clearly than in this example:
https://www.cplusplus.com/reference/cstdio/fread/

EDIT: I added some comments and a loop that (should) print the file as a hex table.
C:
/* fread example: read an entire file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE* pFile;
  long lSize;
  char* buffer;
  size_t result;

  /* Open the file for reading (r) in binary mode (b) */
  pFile = fopen("myfile.bin", "rb"); // rb = read in binary mode
  
  /* Check that file open was successful */
  if (pFile==NULL) {fputs("File error",stderr); exit (1);}

  // obtain file size:
  fseek(pFile,0,SEEK_END);
  lSize = ftell(pFile);
  rewind(pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc(sizeof(char)*lSize);
  /* Check that memory allocation was successful */
  if (buffer == NULL) {fputs("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread(buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */
  /* You can access the file byte by byte: */
  buffer[0]; // First byte of the file
  buffer[1]; // second byte of the file
  // etc. up to:
  buffer[lSize-1]; // last byte of the file
  
  // This prints the file as hex values, byte by byte
  for(long i=0; i<lSize; i++)
  {
  	if(!(i%16)) { printf("\n"); }
  		
  	printf("%02X ", buffer[i]);
  }

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}
 
Last edited:
hi T,
Thanks a lot!

I compiled and ran the code you attached here - thanks a lot for the comments!!

it worked great with reading text file - i.e. changing myfile.bin to myfile.txt.

But, when I change it to myfile.bmp, and read a bmp file, i don't get the expected BMP format.

That's the problem I encounter - reading bmp files.

For some reason, it looks like mission impossible.
 
Are you saying that the program output is different than what irfanview shows? Or is the .bmp file format different from what you expect? Can you post the test image you are using?
 
I think I spotted a problem with your first program (post #13). The line where you print the hex value:
printf("%x",ch);

This does not print leading zeros. So the hex value 0x0F prints as "F".. not "0F". This makes tracking the hex values by eye impossible (unless you print spaces between the values).

The printf in my code should always print 2 digit hex values:
printf("%02X ", buffer);

Then there is a thing called "Endianness". Which means that the value 0x0009CEF6 might be written in the file two ways:
Big endian: 00 09 CE F6
Little endian: F6 CE 09 00
 
Last edited:
Are you saying that the program output is different than what irfanview shows? Or is the .bmp file format different from what you expect? Can you post the test image you are using?

Hi T.

This is the image.
image.png
it is not png file, it is 256 color bmp file (for some reason, when I uploaded it, it was converted to png file by the website.

This is the what DEC-C++ read after running your code:

42 4D FFFFFFB6 07 00 00 00 00 00 00 36 04 00 00 28 00
00 00 1F 00 00 00 1C 00 00 00 01 00 08 00 00 00
00 00 FFFFFF80 03 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 FFFFFF80 00 00 FFFFFF80
00 00 00 FFFFFF80 FFFFFF80 00 FFFFFF80 00 00 00 FFFFFF80 00 FFFFFF80 00 FFFFFF80
FFFFFF80
00 00 FFFFFFC0 FFFFFFC0 FFFFFFC0 00 FFFFFFC0 FFFFFFDC FFFFFFC0 00 FFFFFFF0 FFFFF
FCA FFFFFFA6 00 00 20
40 00 00 20 60 00 00 20 FFFFFF80 00 00 20 FFFFFFA0 00 00 20
FFFFFFC0 00 00 20 FFFFFFE0 00 00 40 00 00 00 40 20 00 00 40
40 00 00 40 60 00 00 40 FFFFFF80 00 00 40 FFFFFFA0 00 00 40
FFFFFFC0 00 00 40 FFFFFFE0 00 00 60 00 00 00 60 20 00 00 60
40 00 00 60 60 00 00 60 FFFFFF80 00 00 60 FFFFFFA0 00 00 60
FFFFFFC0 00 00 60 FFFFFFE0 00 00 FFFFFF80 00 00 00 FFFFFF80 20 00 00 FFFFFF80
40 00 00 FFFFFF80 60 00 00 FFFFFF80 FFFFFF80 00 00 FFFFFF80 FFFFFFA0 00 00 FFFFF
F80
FFFFFFC0 00 00 FFFFFF80 FFFFFFE0 00 00 FFFFFFA0 00 00 00 FFFFFFA0 20 00 00 FFFFF
FA0
40 00 00 FFFFFFA0 60 00 00 FFFFFFA0 FFFFFF80 00 00 FFFFFFA0 FFFFFFA0 00 00 FFFFF
FA0
FFFFFFC0 00 00 FFFFFFA0 FFFFFFE0 00 00 FFFFFFC0 00 00 00 FFFFFFC0 20 00 00 FFFFF
FC0
40 00 00 FFFFFFC0 60 00 00 FFFFFFC0 FFFFFF80 00 00 FFFFFFC0 FFFFFFA0 00 00 FFFFF
FC0
FFFFFFC0 00 00 FFFFFFC0 FFFFFFE0 00 00 FFFFFFE0 00 00 00 FFFFFFE0 20 00 00 FFFFF
FE0
40 00 00 FFFFFFE0 60 00 00 FFFFFFE0 FFFFFF80 00 00 FFFFFFE0 FFFFFFA0 00 00 FFFFF
FE0
FFFFFFC0 00 00 FFFFFFE0 FFFFFFE0 00 40 00 00 00 40 00 20 00 40 00
40 00 40 00 60 00 40 00 FFFFFF80 00 40 00 FFFFFFA0 00 40 00
FFFFFFC0 00 40 00 FFFFFFE0 00 40 20 00 00 40 20 20 00 40 20
40 00 40 20 60 00 40 20 FFFFFF80 00 40 20 FFFFFFA0 00 40 20
FFFFFFC0 00 40 20 FFFFFFE0 00 40 40 00 00 40 40 20 00 40 40
40 00 40 40 60 00 40 40 FFFFFF80 00 40 40 FFFFFFA0 00 40 40
FFFFFFC0 00 40 40 FFFFFFE0 00 40 60 00 00 40 60 20 00 40 60
40 00 40 60 60 00 40 60 FFFFFF80 00 40 60 FFFFFFA0 00 40 60
FFFFFFC0 00 40 60 FFFFFFE0 00 40 FFFFFF80 00 00 40 FFFFFF80 20 00 40 FFFFFF80
40 00 40 FFFFFF80 60 00 40 FFFFFF80 FFFFFF80 00 40 FFFFFF80 FFFFFFA0 00 40 FFFFF
F80
FFFFFFC0 00 40 FFFFFF80 FFFFFFE0 00 40 FFFFFFA0 00 00 40 FFFFFFA0 20 00 40 FFFFF
FA0
40 00 40 FFFFFFA0 60 00 40 FFFFFFA0 FFFFFF80 00 40 FFFFFFA0 FFFFFFA0 00 40 FFFFF
FA0
FFFFFFC0 00 40 FFFFFFA0 FFFFFFE0 00 40 FFFFFFC0 00 00 40 FFFFFFC0 20 00 40 FFFFF
FC0
40 00 40 FFFFFFC0 60 00 40 FFFFFFC0 FFFFFF80 00 40 FFFFFFC0 FFFFFFA0 00 40 FFFFF
FC0
FFFFFFC0 00 40 FFFFFFC0 FFFFFFE0 00 40 FFFFFFE0 00 00 40 FFFFFFE0 20 00 40 FFFFF
FE0
40 00 40 FFFFFFE0 60 00 40 FFFFFFE0 FFFFFF80 00 40 FFFFFFE0 FFFFFFA0 00 40 FFFFF
FE0
FFFFFFC0 00 40 FFFFFFE0 FFFFFFE0 00 FFFFFF80 00 00 00 FFFFFF80 00 20 00 FFFFFF80
00
40 00 FFFFFF80 00 60 00 FFFFFF80 00 FFFFFF80 00 FFFFFF80 00 FFFFFFA0 00 FFFFFF80
00
FFFFFFC0 00 FFFFFF80 00 FFFFFFE0 00 FFFFFF80 20 00 00 FFFFFF80 20 20 00 FFFFFF80
20
40 00 FFFFFF80 20 60 00 FFFFFF80 20 FFFFFF80 00 FFFFFF80 20 FFFFFFA0 00 FFFFFF80
20
FFFFFFC0 00 FFFFFF80 20 FFFFFFE0 00 FFFFFF80 40 00 00 FFFFFF80 40 20 00 FFFFFF80
40
40 00 FFFFFF80 40 60 00 FFFFFF80 40 FFFFFF80 00 FFFFFF80 40 FFFFFFA0 00 FFFFFF80
40
FFFFFFC0 00 FFFFFF80 40 FFFFFFE0 00 FFFFFF80 60 00 00 FFFFFF80 60 20 00 FFFFFF80
60
40 00 FFFFFF80 60 60 00 FFFFFF80 60 FFFFFF80 00 FFFFFF80 60 FFFFFFA0 00 FFFFFF80
60
FFFFFFC0 00 FFFFFF80 60 FFFFFFE0 00 FFFFFF80 FFFFFF80 00 00 FFFFFF80 FFFFFF80 20
00 FFFFFF80 FFFFFF80
40 00 FFFFFF80 FFFFFF80 60 00 FFFFFF80 FFFFFF80 FFFFFF80 00 FFFFFF80 FFFFFF80 FF
FFFFA0 00 FFFFFF80 FFFFFF80
FFFFFFC0 00 FFFFFF80 FFFFFF80 FFFFFFE0 00 FFFFFF80 FFFFFFA0 00 00 FFFFFF80 FFFFF
FA0 20 00 FFFFFF80 FFFFFFA0
40 00 FFFFFF80 FFFFFFA0 60 00 FFFFFF80 FFFFFFA0 FFFFFF80 00 FFFFFF80 FFFFFFA0 FF
FFFFA0 00 FFFFFF80 FFFFFFA0
FFFFFFC0 00 FFFFFF80 FFFFFFA0 FFFFFFE0 00 FFFFFF80 FFFFFFC0 00 00 FFFFFF80 FFFFF
FC0 20 00 FFFFFF80 FFFFFFC0
40 00 FFFFFF80 FFFFFFC0 60 00 FFFFFF80 FFFFFFC0 FFFFFF80 00 FFFFFF80 FFFFFFC0 FF
FFFFA0 00 FFFFFF80 FFFFFFC0
FFFFFFC0 00 FFFFFF80 FFFFFFC0 FFFFFFE0 00 FFFFFF80 FFFFFFE0 00 00 FFFFFF80 FFFFF
FE0 20 00 FFFFFF80 FFFFFFE0
40 00 FFFFFF80 FFFFFFE0 60 00 FFFFFF80 FFFFFFE0 FFFFFF80 00 FFFFFF80 FFFFFFE0 FF
FFFFA0 00 FFFFFF80 FFFFFFE0
FFFFFFC0 00 FFFFFF80 FFFFFFE0 FFFFFFE0 00 FFFFFFC0 00 00 00 FFFFFFC0 00 20 00 FF
FFFFC0 00
40 00 FFFFFFC0 00 60 00 FFFFFFC0 00 FFFFFF80 00 FFFFFFC0 00 FFFFFFA0 00 FFFFFFC0
00
FFFFFFC0 00 FFFFFFC0 00 FFFFFFE0 00 FFFFFFC0 20 00 00 FFFFFFC0 20 20 00 FFFFFFC0
20
40 00 FFFFFFC0 20 60 00 FFFFFFC0 20 FFFFFF80 00 FFFFFFC0 20 FFFFFFA0 00 FFFFFFC0
20
FFFFFFC0 00 FFFFFFC0 20 FFFFFFE0 00 FFFFFFC0 40 00 00 FFFFFFC0 40 20 00 FFFFFFC0
40
40 00 FFFFFFC0 40 60 00 FFFFFFC0 40 FFFFFF80 00 FFFFFFC0 40 FFFFFFA0 00 FFFFFFC0
40
FFFFFFC0 00 FFFFFFC0 40 FFFFFFE0 00 FFFFFFC0 60 00 00 FFFFFFC0 60 20 00 FFFFFFC0
60
40 00 FFFFFFC0 60 60 00 FFFFFFC0 60 FFFFFF80 00 FFFFFFC0 60 FFFFFFA0 00 FFFFFFC0
60
FFFFFFC0 00 FFFFFFC0 60 FFFFFFE0 00 FFFFFFC0 FFFFFF80 00 00 FFFFFFC0 FFFFFF80 20
00 FFFFFFC0 FFFFFF80
40 00 FFFFFFC0 FFFFFF80 60 00 FFFFFFC0 FFFFFF80 FFFFFF80 00 FFFFFFC0 FFFFFF80 FF
FFFFA0 00 FFFFFFC0 FFFFFF80
FFFFFFC0 00 FFFFFFC0 FFFFFF80 FFFFFFE0 00 FFFFFFC0 FFFFFFA0 00 00 FFFFFFC0 FFFFF
FA0 20 00 FFFFFFC0 FFFFFFA0
40 00 FFFFFFC0 FFFFFFA0 60 00 FFFFFFC0 FFFFFFA0 FFFFFF80 00 FFFFFFC0 FFFFFFA0 FF
FFFFA0 00 FFFFFFC0 FFFFFFA0
FFFFFFC0 00 FFFFFFC0 FFFFFFA0 FFFFFFE0 00 FFFFFFC0 FFFFFFC0 00 00 FFFFFFC0 FFFFF
FC0 20 00 FFFFFFC0 FFFFFFC0
40 00 FFFFFFC0 FFFFFFC0 60 00 FFFFFFC0 FFFFFFC0 FFFFFF80 00 FFFFFFC0 FFFFFFC0 FF
FFFFA0 00 FFFFFFF0 FFFFFFFB
FFFFFFFF 00 FFFFFFA4 FFFFFFA0 FFFFFFA0 00 FFFFFF80 FFFFFF80 FFFFFF80 00 00 00 FF
FFFFFF 00 00 FFFFFFFF
00 00 00 FFFFFFFF FFFFFFFF 00 FFFFFFFF 00 00 00 FFFFFFFF 00 FFFFFFFF 00 FFFFFFFF
FFFFFFFF
00 00 FFFFFFFF FFFFFFFF FFFFFFFF 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00 FFFFFFFD FFFFFFFD FFFFFFFD FFFFF
FFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD
FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD FFFFFFFD 00


irfanview does not read FFs at all (I cannot copy what it reads)
I'll write down the first 16 bytes irfanview reads:
42 4d b6 07 00 00 00 00
00 00 36 04 00 00 28 00


I'm beginning to think there's something wrong with DEV-C++ (I used an empy project in C).
 
You can edit most of the output away, just leave the first ~10 lines.. or put it in CODE -tags.

It looks like that for some reason when the first digit is 8 or greater, the program prints those "FFFFFF" things in front of the digit.. for example "60" prints fine, but "80" prints "FFFFFF80". At least that seems to be the pattern quickly thinking. I have no idea why that happens. Maybe there is a bug in your library function.

I can't use that png image for anything.. Maybe you can zip the BMP file and post it.
 
Last edited:
Try this.. I added a simple custom "printHex" function.

C:
/* fread example: read an entire file */
#include <stdio.h>
#include <stdlib.h>

void printHex(char value);
void printHexNible(char value);

int main () {
  FILE* pFile;
  long lSize;
  char* buffer;
  size_t result;
 
  /* Open the file for reading (r) in binary mode (b) */
  pFile = fopen("myfile.bin", "rb"); // rb = read in binary mode
 
  /* Check that file open was successful */
  if (pFile==NULL) {fputs("File error",stderr); exit (1);}
 
  // obtain file size:
  fseek(pFile,0,SEEK_END);
  lSize = ftell(pFile);
  rewind(pFile);
 
  // allocate memory to contain the whole file:
  buffer = (char*) malloc(sizeof(char)*lSize);
  /* Check that memory allocation was successful */
  if (buffer == NULL) {fputs("Memory error",stderr); exit (2);}
 
  // copy the file into the buffer:
  result = fread(buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
 
  /* the whole file is now loaded in the memory buffer. */
  /* You can access the file byte by byte: */
  buffer[0]; // First byte of the file
  buffer[1]; // second byte of the file
  // etc. up to:
  buffer[lSize-1]; // last byte of the file
 
  // This prints the file as hex values, byte by byte
  for(long i=0; i<lSize; i++)
  {
  	if(!(i%16)) { printf("\n"); }
 
  	//printf("%02X ", buffer[i]);
        printHEX(buffer[i]);
  }
 
  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

void printHex(char value)
{
	printHexNible(value >> 4);
	printHexNible(value & 0x0F);
}

void printHexNible(char value)
{
	if (value == 0) {printf("0");}
	else if (value == 1) {printf("1");}
	else if (value == 2) {printf("2");}
	else if (value == 3) {printf("3");}
	else if (value == 4) {printf("4");}
	else if (value == 5) {printf("5");}
	else if (value == 6) {printf("6");}
	else if (value == 7) {printf("7");}
	else if (value == 8) {printf("8");}
	else if (value == 9) {printf("9");}
	else if (value == 10) {printf("A");}
	else if (value == 11) {printf("B");}
	else if (value == 12) {printf("C");}
	else if (value == 13) {printf("D");}
	else if (value == 14) {printf("E");}
	else if (value == 15) {printf("F");}
}
 
Last edited:
[/COLOR]
irfanview does not read FFs at all (I cannot copy what it reads)
I'll write down the first 16 bytes irfanview reads:
42 4d b6 07 00 00 00 00
00 00 36 04 00 00 28 00


I'm beginning to think there's something wrong with DEV-C++ (I used an empy project in C).

Yes, I too think that there is a bug in the printf-function when printing hex values.

The Irfanview output seems to be correct:

The first two bytes are 42 4d, which in ascii is "BM".. so that is correct.

Note that the "file size (4 bytes)" is in "Little Endian". So, the "B6 07 00 00" is a hex value: 0x000007B6
.. this is a file size of 1974 bytes. Does this seem to be correct?
 
Last edited:
Yes, I too think that there is a bug in the printf-function when printing hex values.

The Irfanview output seems to be correct:

The first two bytes are 42 4d, which in ascii is "BM".. so that is correct.

Note that the "file size (4 bytes)" is in "Little Endian". So, the "B6 07 00 00" is a hex value: 0x000007B6
.. this is a file size of 1974 bytes. Does this seem to be correct?

You're correct, the file size id 1974.
This it the file (in rar)

I tried your new code on it.
But I got:

424D607000000000000360400002800
00001F0000001C000000010008000000
0000003000000000000000000000000
000000000000000000000000000000
0000000000000000000000000
0000000000C0000A6000020
400000206000002000000200000020
000002000000400000004020000040
400000406000004000000400000040
000004000000600000006020000060
400000606000006000000600000060
000006000000000000002000000
40000006000000000000000000
00000000000000000002000000
40000006000000000000000000
00000000000000000002000000
40000006000000000000000000
00000000000000000002000000
40000006000000000000000000
00000000040000000400020004000
400040006000400000040000004000
000400000040200000402020004020
400040206000402000040200004020
000402000040400000404020004040
400040406000404000040400004040
000404000040600000406020004060
400040606000406000040600004060
000406000040000004002000400
40004006000400000400000400
00040000040000004002000400
40004006000400000400000400
00040000040000004002000400
40004006000400000400000400
00040000040000004002000400
40004006000400000400000400
00040000000000000002000000
40000006000000000000000000
00000000002000000202000020
40000206000020000020000020
00002000004000000402000040
40000406000040000040000040
00004000006000000602000060
40000606000060000060000060
00006000000000000200000
4000006000000000000000
0000000000000000200000
4000006000000000000000
0000000000000000200000
4000006000000000000000
0000000000000000200000
4000006000000000000000
0000000000000000002000000
40000006000000000000000000
00000000002000000202000020
40000206000020000020000020
00002000004000000402000040
40000406000040000040000040
00004000006000000602000060
40000606000060000060000060
00006000000000000200000
4000006000000000000000
0000000000000000200000
4000006000000000000000
0000000000000000200000
400000600000000000000B
F0040000000000000F0000F
000000FF00F000000F00F00FF
0000FFF00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00DDDDDDDDDD
DDDDDDDDDDDDDDDD
DDDDD00


As you can see in irfanview, now that you got the bmp file (in rar), it gives different reading.
 
Ok.. I figured out what was going on with the added "FFFFFF" things: Signed numbers are presented as 2's complement, so -1 is hexadecimal (32bit integer) 0xFFFFFFFF.
So, when the most significant bit of the char is 1, it is treated as a negative number. This would not normally be a problem.. a bit pattern is a bit pattern, but here is the catch! All 8 bit chars are first promoted to 32 bit integers before they are passed to printf! Therefore the extra bytes for positive numbers are '00', but for negative numbers they must be 'FF' (because of 2's complement). The added zeros of course are not printed, but the 'FF' for 2's complement negative numbers must be printed.
 
Last edited:
As you can see in irfanview, now that you got the bmp file (in rar), it gives different reading.

Change all the chars to "unsigned char".. should fix the problem.
.. or first try modifying only the printHex and printHexNible -functions to use unsigned chars.

Actually this one change should fix the printing:

change this
printHexNible(value >> 4);

to this
printHexNible((value >> 4) & 0x0F);
 
T,
I changed all "char"s to "unsigned char"s and it works great :)
I'm now studying your code and debugging it.
So I could learn from your wisdom :)

Thank a lot man!


are you a programmer?
I mean, you fill a programmer position?
 
I mean, you fill a programmer position?

Yes and no. At the moment I teach embedded systems (C programming) at my University. It's been a long time since I have programmed C on PC environment.. that is why it took some time to fix that printing problem :) In embedded environments chars are usually "unsigned" by default and variables are not promoted. I like to use C# when I need to write a desktop application.. I've had short-time job as a C# programmer few years ago. But, C in embedded systems is my thing when it comes to programming.
 
Last edited:
Man, embedded is so challenging and interesting.
I wish to have it as main profession!
Good luck with your teaching! :)
 
T,

How'd you take all that ascii values and convert them from ascii chars to hex numbers, in order to write them to a text file?
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top