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;
}
 
    