Balaraj Nayak Ответов: 2

Фрагментация больших данных на небольшие пакеты с использованием языка Си


Как фрагментировать большие данные в маленькие пакеты. поскольку я новичок, я не могу этого достичь, кто-нибудь поможет фрагментировать большие данные на маленькие пакеты .

скажем, у меня есть 22 КБ jpeg-файла, который я хочу разделить на небольшие пакеты по 960 байт каждый. для jpeg будут начальные два бита, а конечные два бита будут фиксированными значениями.

то, что я пробовал, это:

Что я уже пробовал:

pstart =buffer;

         if (!frame_active)
         {
             if ((pstart[0] == 0xff) && (pstart[1] == 0xd8))
             {
                 frame_active = 1;
                 frame_started = 1;
             }
         }

         if (frame_active)
         {
         // If an end of frame marker was pending (last byte of previous sample
         // was 0xff) then check first byte might be EOF marker.
             if (frame_eof_pending)
             {
                 if (*pstart == 0xd9)
                 {
                     // Only first byte of this sample is valid.
                     len = 1;
                     frame_active = 0;
                     frame_ended = 1;
                     //m_SendIdx++;
                 }
                 frame_eof_pending = 0;
             }

             // Look for end of frame markers in this sample.
             if (frame_active)
             {
                 pmark = pstart;
                 while (pmark)
                 {
                     pmark = memchr(pmark, 0xff, sample_length - (pmark - pstart));
                     if (pmark)
                     {
                         pmark++;
                         if ((pmark - pstart) == sample_length)
                         {
                         //The last byte of the sample is 0xff so there might be
                         //and end of frame marker continued on the next sample.
                             frame_eof_pending = 1;
                         }
                         else if (*pmark == 0xd9)
                         {
                         // Length of remaining data is up to and including the
                         // 0xd9 of the end of frame marker.
                             len = pmark - pstart + 1;
                             frame_active = 0;
                             frame_ended = 1;
                         }
                     }
                 }
             }
ЛЮБАЯ ПОМОЩЬ БУДЕТ ОЦЕНЕНА ПО ДОСТОИНСТВУ , СПАСИБО.

Richard MacCutchan

Это довольно простое дело-прочитать файл 960 (или любое другое число) байт за один раз и отправить их на удаленный конец. Добавление байтов префикса и суффикса помогает каждому концу поддерживать синхронизацию.

Balaraj Nayak

Привет @Richard MacCutchan, если это возможно , не могли бы вы показать написанный код для меня?, скажем, это файл размером 22k байт, если я хочу отправить каждый пакет с размером 960, последний пакет не будет точным 960 байт.

2 Ответов

Рейтинг:
1

Jochen Arndt

Ваш код не будет работать, потому что данные изображения также могут содержать маркеры JPEG (здесь: конец маркера изображения FF D9).

Таким образом, вы должны написать синтаксический анализатор, который также получает длину сегмента для всех не автономных маркеров. Когда такой сегмент обрабатывается, передайте все байты длины без проверки на наличие маркеров. Возможно, вам придется обрабатывать также сжатые данные, которые не имеют длины, но останавливаются на следующем маркере 0xff, за которым не следует 0x00 (0x00 вставляется в сжатые данные после всех байтов 0xff).

Я предлагаю прочитать о формате файла JPEG. Формат обмена файлами JPEG - Википедия[^] может быть отправной точкой.

Псевдокод (без отложенных проверок):

if (seg_length)
{
    // Pass seg_length data as they are (e.g. using a function)
    int len = PassSegment(pstart, seg_length);
    pstart += len;
    seg_length -= len;
}
else if (compressed)
{
    // Pass data as they are until 0xff not followed by 0x00
    int len = PassCompressed(pstart);
    pstart += len;
    if (pstart[0] == 0xff && pstart[1])
        compressed = 0; // All compressed data has been passed
}
else if (pstart[0] == 0xff)
{
    // Pass marker (two bytes)

    // Check if marker has length bytes
    if (MarkerHasLength(pstart[1]))
    {
        // Pass length (two bytes)

        // Includes the two length bytes
        seg_length = pstart[2] * 256 + pstart[3] - 2;
        pstart += 2; // length (marker is adjusted below)
    }
    // Special handling for compressed data (SOS marker)
    // These stop at the next 0xff not followed by 0x00
    else if (pstart[1] == 0xda)
    {
        compressed = 1;
    }
    pstart += 2; // marker
}
else
{
    // Parsing error: 0xff expected
}


Balaraj Nayak

Спасибо вам, сэр @Йохен Арндт , спасибо за ваш ответ ,да , я знаю о данных jpeg, как я уже сказал выше, в biginning end будут фиксированные биты, я имел в виду, что биты маркера jpeg. ваш ответ был бы мне полезен, еще раз спасибо.

Рейтинг:
0

KarstenK

Для передачи по сети достаточно расщепления двоичных данных.

Если вы хотите меньший размер jpeg, чем вы должны использовать более высокое сжатие или разделить распакованное изображение на суб-изображения и чем сжимать. Статья CXImage показывает эти приемы.


Balaraj Nayak

Привет, Карстенк, спасибо вам ,сэр, за ваш ценный ответ, да, я прочитаю эту статью, если она поможет мне решить мою проблему.