URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3921
[ Назад ]

Исходное сообщение
"Как узнать что за символ? (предыдущую не считать) - ошибся в теме :\"

Отправлено victorddt , 07-Фев-05 11:05 
Читаю из бинарного файла:
act_read=fread(buffer,1,BSIZE,in);

Как можно узнать что кладется в buffer?
Обычный printf(); не дает ничего хорошего:( Да, наверно и не должен :)

Спасибо.


Содержание

Сообщения в этом обсуждении
"Как узнать что за символ? (предыдущую не считать) - ошибся в..."
Отправлено karasiov , 07-Фев-05 12:47 
>Читаю из бинарного файла:
>act_read=fread(buffer,1,BSIZE,in);
>
>Как можно узнать что кладется в buffer?
>Обычный printf(); не дает ничего хорошего:( Да, наверно и не должен :)
>
>
>Спасибо.
man fread

NAME
fread, fwrite - binary stream input/output

SYNOPSIS
#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
<skip>
DESCRIPTION
The function fread reads nmemb elements of data, each size bytes  long,
from  the  stream  pointed  to  by stream, storing them at the location
given by ptr.

Вы точно читаете УКАЗАТЕЛЬ?



"Как узнать что за символ?"
Отправлено victorddt , 07-Фев-05 13:50 
>>Читаю из бинарного файла:
>>act_read=fread(buffer,1,BSIZE,in);
>>
>>Как можно узнать что кладется в buffer?
>>Обычный printf(); не дает ничего хорошего:( Да, наверно и не должен :)
>>
>>
>>Спасибо.
>man fread
>
>NAME
>fread, fwrite - binary stream input/output
>
>SYNOPSIS
>#include <stdio.h>
>
>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
><skip>
>DESCRIPTION
>The function fread reads nmemb elements of data, each size bytes  
>long,
>from  the  stream  pointed  to  by stream,
>storing them at the location
>given by ptr.
>
>Вы точно читаете УКАЗАТЕЛЬ?


Вот фрагмет файла:
 ╪ р
CVS_NT-DATA █
4"@.0&4LCPOKCIHT^yfTYrZHIiПjr|АЗИЗQeФЯУГЭyДЗВ █

%&'()

Он не текстовый (допустим картинка).
Мне нужно перебрать по байтам (или по 4 байта - неважно). При встрече определенной комбинации байтов, например: FF D8 FF E0 что-либо делать.

Так вот как просматривая каждый раз buffer узнать его шестнадцатеричное предстваление?


"Как узнать что за символ?"
Отправлено karasiov , 07-Фев-05 14:04 
>>>Читаю из бинарного файла:
>>>act_read=fread(buffer,1,BSIZE,in);
>>>
>>>Как можно узнать что кладется в buffer?
>>>Обычный printf(); не дает ничего хорошего:( Да, наверно и не должен :)
>>>
>>>
>>>Спасибо.
>>man fread
>>
>>NAME
>>fread, fwrite - binary stream input/output
>>
>>SYNOPSIS
>>#include <stdio.h>
>>
>>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
>><skip>
>>DESCRIPTION
>>The function fread reads nmemb elements of data, each size bytes  
>>long,
>>from  the  stream  pointed  to  by stream,
>>storing them at the location
>>given by ptr.
>>
>>Вы точно читаете УКАЗАТЕЛЬ?
>
>
>Вот фрагмет файла:
> ╪ р
>CVS_NT-DATA █
>4"@.0&4LCPOKCIHT^yfTYrZHIiПjr|АЗИЗQeФЯУГЭyДЗВ █
> 
>%&'()
>
>Он не текстовый (допустим картинка).
>Мне нужно перебрать по байтам (или по 4 байта - неважно). При
>встрече определенной комбинации байтов, например: FF D8 FF E0 что-либо делать.
>
>
>Так вот как просматривая каждый раз buffer узнать его шестнадцатеричное предстваление?

Сразу так ничего и не придумать. Можно попробовать двоичные маски и смотреть на результаты.



"Как узнать что за символ?"
Отправлено Android , 07-Фев-05 14:27 
>>>>Читаю из бинарного файла:
>>>>act_read=fread(buffer,1,BSIZE,in);
>>>>
>>>>Как можно узнать что кладется в buffer?
>>>>Обычный printf(); не дает ничего хорошего:( Да, наверно и не должен :)
>>>>
>>>>
>>>>Спасибо.
>>>man fread
>>>
>>>NAME
>>>fread, fwrite - binary stream input/output
>>>
>>>SYNOPSIS
>>>#include <stdio.h>
>>>
>>>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
>>><skip>
>>>DESCRIPTION
>>>The function fread reads nmemb elements of data, each size bytes  
>>>long,
>>>from  the  stream  pointed  to  by stream,
>>>storing them at the location
>>>given by ptr.
>>>
>>>Вы точно читаете УКАЗАТЕЛЬ?
>>
>>
>>Вот фрагмет файла:
>> ╪ р
>>CVS_NT-DATA █
>>4"@.0&4LCPOKCIHT^yfTYrZHIiПjr|АЗИЗQeФЯУГЭyДЗВ █
>> 
>>%&'()
>>
>>Он не текстовый (допустим картинка).
>>Мне нужно перебрать по байтам (или по 4 байта - неважно). При
>>встрече определенной комбинации байтов, например: FF D8 FF E0 что-либо делать.
>>
>>
>>Так вот как просматривая каждый раз buffer узнать его шестнадцатеричное предстваление?
>
>Сразу так ничего и не придумать. Можно попробовать двоичные маски и смотреть
>на результаты.

Вывести на экран буффер можно так:
for(unsigned i=0;i<buff_size;i++)
   printf("%x\n",(int)buff[i]);
А проверить на соответствие комбинации можно простым сравнением:
for(unsigned i=0;i<buff_size-3;i++)
if((buff[i]==0xF0)&&(buff[i+1]==0xFE)&&(buff[i+2]==0xD0)&&(buff[i+3]==0xEF))
//Делать что-то


"Как узнать что за символ?"
Отправлено victorddt , 07-Фев-05 14:28 
>Сразу так ничего и не придумать. Можно попробовать двоичные маски и смотреть
>на результаты.


#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#define BSIZE 1

int main()
{
FILE *in, *out;
char *buffer[BSIZE], mask;
int act_read;
mask = 0xD9;

in=fopen("1.JPG","rb");
out=fopen("1_1.JPG","wb");

do
{
  act_read=fread(*buffer,1,BSIZE,in);
  
  if(buffer & mask) /* ---ссылается сюда--- */
  {
   printf("AAAAA\n");
  }

  fwrite(*buffer,1,act_read,out);
}while (act_read == BSIZE);


fclose(in);
fclose(out);
}

Выдается ошибка:
invalid operands to binary &


"Как узнать что за символ?"
Отправлено Alexander S. Salieff , 07-Фев-05 20:57 
> char *buffer[BSIZE], mask;
> mask = 0xD9;
>
>  if(buffer & mask) /* ---ссылается сюда--- */

>Выдается ошибка:
>invalid operands to binary &


Ну епт, почитай ты про типы, массивы и указатели. Не буду тебе пересказывать абзацы из букварей, просто скажу что лексема buffer в твоем случае это переменная типа char **, а mask - переменная типа char. И каким раком ты собираешься скрещивать их в бинарном AND, абсолютно неясно ни мне, ни компилятору. Потом, у меня есть явное подозрение, что ты плохо понимаешь разницу между "&" и "&&" (а она немалая), и врядли понимаешь смысл вот этого вот "if(buffer & mask)", которое тебе выдаст не равенство маске, а соответствие единичных битов в соответствующих позициях аргументов. Подозреваю, что, скорее всего, ты имел ввиду (соответствуя объявлениям твоих segfault'ных указателей ;) "if(*buffer[0]==mask && ...)"
Про ошибки сегментации я писал тебе в другом треде.