سؤال

ويا هناك. أنا أحاول كتابة برنامج صغير من شأنها أن قراءة أربعة بايت التالية بعد وقوع الأخير من "عشرية 0xFF 0xC0 0x00 0x11" التي يمكن تحويلها بسهولة إلى ثنائي أو عشري. والغرض من ذلك هو أن وحدات البايت 2-5 بعد وقوع الأخير من هذا النمط عرافة تمثل العرض والارتفاع من ملف JPEG.

#include <stdio.h>

 int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "pano8sample.jpg" , "rb" );
  if(pFile==NULL){
   fputs ("File error",stderr);
   exit (1);
  }

  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  printf("\n\nFile is %d bytes big\n\n", lSize);

  buffer = (char*) malloc (sizeof(char)*lSize);
  if(buffer == NULL){
   fputs("Memory error",stderr);
   exit (2);
  }

  result = fread (buffer,1,lSize,pFile);
  if(result != lSize){
   fputs("Reading error",stderr);
   exit (3);
  }

  //0xFF 0xC0 0x00 0x11 (0x08)

  //Logic to check for hex/binary/dec

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

والمشكلة هي أنني لا أعرف كيفية قراءة من الذاكرة مخزنة بشكل متكرر واستخدام المتغير الأكثر قراءة مؤخرا في عدد صحيح لمقارنة ضد بلدي ثنائي / عرافة / ديسمبر

وكيف أفعل هذا؟

هل كانت مفيدة؟

المحلول

byte needle[4] = {0xff, 0xc0, 0x00, 0x11};
byte *last_needle = NULL;
while (true) {
  byte *p = memmem(buffer, lSize, needle, 4); 
  if (!p) break;
  last_needle = p;
  lSize -= (p + 4) - buffer;
  buffer = p + 4;
}

إذا last_needle ليس لاغية، يمكنك طباعة last_needle+4 ...

نصائح أخرى

وبدلا من قراءة الملف بأكمله في الذاكرة، وأود أن استخدام قليلا من جهاز الدولة. بلدي C هو صدئ قليلا، ولكن:

char searchChars[] = {0xFF,0xC0,0x00,0x11};
char lastBytes[5];
int pos = 0; int curSearch = 0;
while(pos <= lSize) {
    curChar = getc(pfile); pos++;            /*readone char*/

    if(curChar == searchChars[curSearch]) { /* found a match */
        curSearch++;                        /* search for next char */
        if(curSearch > 3) {                 /* found the whole string! */
            curSearch = 0;                  /* start searching again */
            read = fread(lastBytes,1,5,pfile); /* read 5 bytes */
            pos += read;                      /* advance position by how much we read */
        }
    } else { /* didn't find a match */
        curSearch = 0;                     /* go back to searching for first char */
    }
 }

وفي النهاية، كنت تركت مع 5 بايت في lastBytes التي هي بايت خمس الحق بعد آخر مرة تجد searchChars

وشخصيا، كنت استخدام دالة أن يبتلع حرف واحد في وقت واحد. فإن وظيفة استخدام آلة الدولة المحدودة للقيام بسيطة المباراة التعبير العادية، وتوفير التفاصيل في المتغيرات المحلية إما ثابتة أو بنية كتلة معلمة. تحتاج يومين كتل الفرعية - واحدة للدولة يقابل جزئيا، واحدة للمباراة كاملة الماضية - كل مما يدل على وظائف أو قيمة ذات الصلة حسب الحاجة

.

في هذه الحالة، يجب أن تكون قادرة على تصميم هذا يدويا. للحصول على متطلبات أكثر تعقيدا، نظرة على راجل .

يمكنك استخدام الدالة fscanf في C / C ++ إذا تم ترميز البيانات في أسكي. إذا كان لا، سيكون لديك لكتابة وظيفة الخاصة بك من شأنها أن تفعل هذا. وهناك طريقة بسيطة تكون لقراءة كمية N بايت من الملف، ابحث في سلسلة بايت لنمط تريد بعد ذلك تستمر حتى EOF.

والتعليمات البرمجية يقرأ الواقع الملف بأكمله دفعة واحدة (لا لزوم لها إذا كان الخط كنت تبحث عن قرب أعلى الملف.) رمز مخازن لديك ملف على كومة كما صفيف بايت (شار ما يعادل بايت في C ++) مع العازلة المؤشر إلى بداية مجموعة متجاورة في الذاكرة. التعامل مع مجموعة عازلة مثلك أن التعامل مع أي مجموعة أخرى.

وأيضا، إذا كنت تنوي القيام به <م> أي شيء بعد أن كنت قد قرأت الحجم، تأكد من أنك تحرير كائن عازلة malloced لتجنب تسرب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top