开发者

How to extract a number/byte from an array in C?

开发者 https://www.devze.com 2023-01-10 14:29 出处:网络
Here i have written a code which produces next 8 numbers from sequence. int next_exp_data(unsigned long long int expected_data)

Here i have written a code which produces next 8 numbers from sequence.

int next_exp_data(unsigned long long int expected_data)
{
  int i=0;
  unsigned long long int seq_gen_value=1976943448883713;
  unsigned long long int temp_data[10];
  temp_data[0]=seq_gen_value;
  for(i=0;i<10;i++)
  { 
     printf("%llu",temp_data[i]);
     putchar('\n');
     expected_data=temp_data[i]; 
     temp_data[i+1]=temp_data[i] +2260630401189896;
  }
  return (expected_data);
}   

I want to know how can i extract each byte/number of the array and return each number/byte ??Please help me out.

EDIT:Here's my code.Basically i want to read a file and compare the contents to check if the data read matches with generated sequential data.Here the buffer contains same data as temp_data is producing(ie 10 numbers like 0x07060504030201 next 0f0e0d0c0b0a0908 etc).I want to comapre buffer's data and the function's data.Can anyone suggest me how can i do.I am stuck.Any changes are appreciated.

 #include<stdio.h>
 #include<stdlib.h>
 #include<inttypes.h>

 int main(void){
    FILE *fp;
    char *buffer,c;
    size_t filesize,buffer_size;
    int i;
    unsigned long long int expecte开发者_Python百科d_data=1976943448883713;
    fp=fopen("seqdata.c","r");
    if(fp==NULL){  
       fputs("Error\n",stderr);
       exit(1);
    }
    fseek(fp,0L,SEEK_END);
    filesize=ftell(fp);
        printf("Size of seqdata file is:%u \n",filesize); 
    fseek(fp,0L,SEEK_SET); 
    buffer=(char*)malloc(sizeof(char)*filesize);
    if(buffer == NULL){
        fputs("\nMemory error ",stderr);
    }
    buffer_size=fread(buffer,sizeof(char),filesize,fp);
    for(i=0;i<buffer_size;i++){
        printf("%c",*(buffer +i));
    }
    printf("No of elements read from file are:%u \n",buffer_size); 

    fseek(fp,0L,SEEK_SET);
    int current_pos = 0;
    while(current_pos < buffer_size){
         if(*(buffer +current_pos) != expected_data)
         {
           fputs("Error\n",stderr);
           exit(1);
         }
         else{
          printf("data matching \n"); 
          current_pos++;
          expected_data=next_exp_data(expected_data);
          }
    }

    fclose(fp);
    free(buffer);
    return 0;   
 }  

 int next_exp_data(unsigned long long int expected_data)
 {
   int i=0;
   unsigned long long int seq_gen_value=1976943448883713;
   unsigned long long int temp_data[10];
   temp_data[0]=seq_gen_value;
   for(i=0;i<10;i++)
   { 
     printf("%llu",temp_data[i]);
     putchar('\n');
     expected_data=temp_data[i]; 
         temp_data[i+1]=temp_data[i] +2260630401189896;
}
return (expected_data);
 }   


It's machine dependent, but this usually works one of two ways:

union {
    unsigned char b [8];
    long long     i;
} v;
v .i = seq_gen_value;
for (int j = 0;  j < 8;  ++j)
    printf ("%d, ", v .b [j]);

On a little endian machine (x86, vax, etc.) the bytes come out with the least significant first. On a big endian machine, they come out with the most significant first.


By the way, it would be more useful to encode the "magic numbers" so that they can be more easily understood what they mean. For example, instead of 1976943448883713, write it as 0x7060504030201.


I think that your function do something like

return 1976943448883713 + 8 * 2260630401189896

And I think your question is not clear enough, like what array you want to return each its number? If you want to return array temp_data, it very easy. You can do that by

int next_exp_data(unsigned long long int expected_data, unsigned long long int temp_data[])
{
  int i=0;
  unsigned long long int seq_gen_value=1976943448883713;
  temp_data[0]=seq_gen_value;
  for(i=0;i<10;i++)
  { 
     printf("%llu",temp_data[i]);
     putchar('\n');
     expected_data=temp_data[i]; 
     temp_data[i+1]=temp_data[i] +2260630401189896;
  }
  return (expected_data);
}   

Call this function with the second params is a array int with size 10. And another thing, I don't think that this function need the 1st param, because it's not be used within the function, so you can remove that from functions params list

int next_exp_data( unsigned long long int temp_data[])
{
  int i=0;
  unsigned long long int expected_data;
  unsigned long long int seq_gen_value=1976943448883713;
  temp_data[0]=seq_gen_value;
  for(i=0;i<10;i++)
  { 
     printf("%llu",temp_data[i]);
     putchar('\n');
     expected_data=temp_data[i]; 
     temp_data[i+1]=temp_data[i] +2260630401189896;
  }
  return expected_data; //dont use (expected_data), it will make things slower.
} 


Comparing numbers in C is done using ==, !=, <= , >= , <, or >.

I didn't read your code as it's horrible formatted and doesn't seem relevant to your question as posed in the title.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号