So I am reading memory that suppose to be bios info in C. And with usual read I get bunch of characters that.. The idea is those characters are making fields like Anchor "String" and 1 byte checksum and 1 Byte Length. But in C number is int or long. INT is 4 bytes. But I have char representing checksum and length is just taking 1 byte (1 character == 0x00 1 byte how to read it as int)
I am doing it like this . unsigned char checksum=mem[0];
first 1 byte character represent checksum. But check sum suppose to be a number which should be unsigned int checksum = mem[0]
.. The printing it prints 0
Then moving on this is how I get 1 byte length from my char array mem
at index 1.
length = mem[1];
//int x=mem[2];
And suppose If I have two byte number (Word length data) representing max size I am doing it like this at index 4 in my character array..
char x1[3];
memcpy(x1,&mem[4],2);
x1[2]='\0';
long v=strtol(x1,'\0',16);
Above is obviously printing wrong result for my max size. printing 0. And it does not seems all right either. long is 8 bytes But I have two byte that should represent my max size field in bios.
May be above is just wrong thinking that if I believe its correct or wrong. the fact is I really dont know how to handle this sort of conversion. Can any one please let me is above is wrong or correct. Or makes sense for what I like to achieve
This is 2.1 table info from bios I am trying to extract. My anchor strings are printing correct but number fields not printing correct I am gett 0 for max size. 31 for length
https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
This is the code
void get_it(char *arr)
{
char *mem = (unsigned char *) &arr[0];
int length, i;
unsigned char checksum=mem[0];
printf("checksum %d\n",checksum);
length = mem[1];
int x=mem[2];
int y=0;
y=mem[3];
printf("\nlength = %d version = %x\n minor version = %d",length,x,mem[3]);
char x1[3];
memcpy(x1,&mem[4],2);
x1[2]='\0';
long v=strtol(x1,'\0',16);
printf("max size %lx\n",v);
printf("entry point revision = %d\n",mem[6]);
printf("~~ %c %c %c %c %c\n",mem[12],mem[13],mem[14],mem[15],mem[16]);
/*checksum = 0;
for(i = 0; i < length; i++)
{
checksum += mem[i];
}
if(checksum == 0) break;
mem += 16;
*/
mem=mem+length;
char type=*mem;
printf("first type = %d",*mem);
printf("length = %d",*(mem+1));
int j=0;
}
int main()
{
int fd=open("/dev/mychardev-0",O_RDWR);
if(fd<=0)
{
printf("fd %d\n",fd);
exit(0);
}
size_t length=1048576;
size_t x=0;
char *buffer=malloc(sizeof(char )*length);
while(x<length)
{
int valread=read(fd,buffer,length);
printf("here\n");
if(valread==0)
{
printf("zero bytes read\n");
break;
}
if(valread<0)
{
printf("read return negative %d %d\n",valread,errno);
break;
}
x=x+valread;
}
if(x>0)
{
size_t y=0;
while(y<x)
{
if(*(buffer+y)=='_' && *(buffer+y+1)=='S' && *(buffer+y+2)=='M' && *(buffer+y+3)=='_')
{
printf("%c\n",buffer[y]);
printf("%c\n",buffer[y+1]);
printf("%c\n",buffer[y+2]);
buffer=buffer+4;
get_it(buffer);
}
y++;
}
printf("%x\n",buffer);
}
else
{
printf("ops no read\n");
}
return 0;
}