Как извлечь число / байт из массива в C? - PullRequest
0 голосов
/ 09 августа 2010

Здесь я написал код, который производит следующие 8 чисел из последовательности.

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

Я хочу знать, как я могу извлечь каждый байт / номер массива и вернуть каждый номер / байт ??помогите мне.

РЕДАКТИРОВАТЬ: Вот мой код. В основном я хочу прочитать файл и сравнить содержимое, чтобы проверить, совпадают ли прочитанные данные с сгенерированными последовательными данными. Вот буфер содержит те же данные, что и temp_data (т.е. 10 чисел, таких как 0x07060504030201, следующий 0f0e0d0c0b0a0908 и т. д.). Я хочу сопоставить данные буфера и данные функции. Кто-нибудь может подсказать, как мне это сделать. Я застрял. Любые изменения приветствуются.

 #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 expected_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);
 }   

Ответы [ 3 ]

1 голос
/ 09 августа 2010

Сравнение чисел в C выполняется с помощью ==,! =, <=,> =, <Или>.

Я не читал ваш код, так как он ужасно отформатирован и не выглядит актуальнымна ваш вопрос, заданный в названии.

0 голосов
/ 09 августа 2010

Я думаю, что ваша функция делает что-то вроде

return 1976943448883713 + 8 * 2260630401189896

И я думаю, что ваш вопрос недостаточно ясен, например, какой массив вы хотите вернуть каждому его номеру? Если вы хотите вернуть массив temp_data, это очень просто. Вы можете сделать это с помощью

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

Вызвать эту функцию со вторыми параметрами - это массив int размером 10. И еще, я не думаю, что для этой функции нужен 1-й параметр, потому что он не используется внутри функции, поэтому вы можете удалить его из списка параметров функции

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.
} 
0 голосов
/ 09 августа 2010

Это зависит от машины, но обычно это работает одним из двух способов:

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]);

На машине с прямым порядком байтов (x86, vax и т. Д.) Байты идут с наименее значимым первым.На старших машинах с порядком байтов они сначала получают наиболее значимые.


Кстати, было бы более полезно кодировать «магические числа», чтобы им было легче понять, что ониимею в виду.Например, вместо 1976943448883713 напишите его как 0x7060504030201.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...