Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119

Бинарное чтение файла

12.04.2013, 11:29. Показов 8781. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
@error_reporting ( E_ALL );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL );
 
@ini_set( 'max_execution_time', 10 );
@set_time_limit( 10 );
 
 
$S4 = 0;
$KADR = 0;
$K_n = 0;
$K_d = 0;
$K_k = 0;
$MASK = '16384';
 
$cicl = '/var/www/kricha/data/www/troyan.dle-templates.info/il76_c';
 
$fp = fopen($cicl, 'rb');
 
if ($fp)
{
    $MASK = dechex( $MASK );
        while (!feof($fp))
    {
      $S4++;
 
                $elem = fread($fp,2);
        $d = bin2hex( $elem );
 
        if( $MASK==$d )
        {
          if ($S4<64) $K_k++;
          if ($S4>64) $K_d++;
          if ($S4==64) $K_n++;
          
          
          $KADR++;
          $S4 = 0;
        }
        }
 
    echo 'Кадров всего: '.$KADR."\n".'Коротких: '.$K_k.PHP_EOL.'Длинных: '.$K_d.PHP_EOL.'Нормальных: '.$K_n;
}
else
{
        die('Невозможно открыть файл.');
}
 
?>
Нужно прочитать файл, вытащить значения и каждое значение сравнивать с маской. Маска - индикатор конца кадра. Вот мне нужно посчитать кол-во кадров. У меня рез-тат: 78, но сказали в этом файле их около 400. Не могу понять в чем я ошибся.

Добавлено через 14 часов 26 минут
В общем, кое-как решил проблему, правда в другом файле, теперь считает кол-во кадров правильно. Теперь проблема в дугом, как из двух битов бинарных данных получить нормальное десятичное число? Как только я не пробовал переводить в число - ничего не выходит.

Могу сбросить файл, с которого нужно считать значения.

Код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?
@header("Content-type: text/css; charset=windows-1251");
@error_reporting ( E_ALL );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL );
@ini_set( 'max_execution_time', 10 );
@set_time_limit( 10 );
 
$e_counter = 0;
$KADR = 0;
$norm_kadr = 0;
$long_kadr = 0;
$short_kadr = 0;
$kadr_end_mask = ord(decbin(16384));
$cicl = '/var/www/kricha/data/www/troyan.dle-templates.info/il76c';
 
$fp = fopen($cicl, 'rb');
 
if ($fp)
{
        while (!feof($fp))
    {
      $e_counter++;
      $elem = fread($fp,2);
      if ($kadr_end_mask == ord($elem))
      {
 
 
        if ($e_counter<64) $short_kadr++; elseif ($e_counter>64) $long_kadr++; elseif ($e_counter==64) $norm_kadr++;
        $KADR++; 
        $e_counter = 0;
        if ($norm_kadr == 66 or $norm_kadr == 67) {
 
          $test[] = $vork_arr;
        }
        $vork_arr = array();
 
      }
 
        }
 
    echo 'Кадров всего: '.$KADR."\n".'Коротких: '.$short_kadr.PHP_EOL.'Длинных: '.$long_kadr.PHP_EOL.'Нормальных: '.$norm_kadr;
    echo "\n\nДлинна файла-копии: ".
      (int)((($KADR/2)/60)/60).' часов '.
      ((($KADR/2)/60)%60).' минут '.
      ( ($KADR/2) - ( ((int) ( ( ($KADR/2)/60 ) ))*60)).' секунд';
}
else
{
        die('Невозможно открыть файл.');
}
fclose($fp);
?>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2013, 11:29
Ответы с готовыми решениями:

Бинарное чтение файла
Всем доброго времени суток. Стоит задача реализовать зашифровать файл RSA ключом в 1024 бит. Но споткнулся с проблемой чтения файла в виде...

Бинарное чтение из файла
Всем доброго времени суток. Столкнулся с проблемой чтения из файла в бинарном режиме. У меня есть исполнительный файл программы для...

Бинарное чтение файла
FILE *ftm; ftm = _wfopen(fff, L&quot;r+&quot;); //fff - это переменная wchar_t содержащая имя файла! unsigned short buf = { 0 }; ...

29
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119
15.04.2013, 00:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
И ещё, судя по фразе

То проверять нужно не так
PHP
1
if ($d == 16384)
а так
PHP
1
if ($d & 16384) // if ($d & 1 << 14)
там не говоритя про другие биты вообще, а значит они могут быть а могут не быть
вот я над этим хотел и подумать, стоит проверять как вы говорите или вообще:
PHP
1
2
3
$kadr_end_mask = decbin(16384);
$elem = unpack('v*',fread($fp,2));
if ($kadr_end_mask[7] === $elem[7])
Но тогда выходит что-то не то, т.к.
PHP
1
2
decbin(16384) = 100000000000000
decbin(255) = 11111111
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.04.2013, 00:10
Да не получится так. Читатьп о 2 байта всё.
Как я понял из описания и кода с++, у вас кадр моет быть оборван в файле, именно для этого мы ищем конец кадра первого и смотрим длину. и если длинна меньше длинны кадра, то кадр не полный и пропускаем.
Нужна длинна.
0
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119
15.04.2013, 00:29  [ТС]
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Да не получится так. Читатьп о 2 байта всё.
Как я понял из описания и кода с++, у вас кадр моет быть оборван в файле, именно для этого мы ищем конец кадра первого и смотрим длину. и если длинна меньше длинны кадра, то кадр не полный и пропускаем.
Нужна длинна.
Так ведь и делаю.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while (!feof($fp))
    {
      $e_counter++;
      $elem = unpack('v*',fread($fp,2));
 
      $vork_arr[] = unpack('n*', $elem);  //Что <CENSORED> сюда записать?!
      if ($kadr_end_mask[7] === $elem[7])
      {
 
        if ($e_counter<64) $short_kadr++; elseif ($e_counter>64) $long_kadr++; elseif ($e_counter==64) $norm_kadr++;
        $KADR++; 
        $e_counter = 0;
        if ($norm_kadr == 1 or $norm_kadr == 2) {
          $test[] = $vork_arr;
        }
        $vork_arr = array();
 
      }
 
        }
Добавлено через 17 минут
В общем, не работает не твоим методом сравнения, ни моим)

 Комментарий модератора 
Использование нецензурных выражений запрещено.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.04.2013, 00:44
Так там не просто сравнивать же нужно.
Нужно брать по байту, и проверять, если совпало проверить длину, что от прошлого совпадения или от начало было 64 итерации.
Тогда это полный кадр типо. На сколько я понял из описания
0
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119
15.04.2013, 00:48  [ТС]
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Так там не просто сравнивать же нужно.
Нужно брать по байту, и проверять, если совпало проверить длину, что от прошлого совпадения или от начало было 64 итерации.
Тогда это полный кадр типо. На сколько я понял из описания
Нет, немного не так..
Кадр это 64 десятичных значения, ну то есть
[1]=> int(81) [2]=> int(83) [3]=> int(255) [4]=> int(156) [5]=> int(93)
и так далее... Так вроде бы, или я уже запутался...
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.04.2013, 01:46
Цитата Сообщение от kRicha Посмотреть сообщение
МСРП-64-2 кадровый параметр регистрируется в 14 разряде кода последнего (63-го) канала каждого кадра. Наличие кадрового сигнала означает значение "1" в этом разряде, отсутствие - "0".
возможно 64 как раз чисел.
а 2 это байт на число...

но судя по тому что в 63 канале етсь 14 бит, значит явно больше 1го байта на канал.

попробуйте как то так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
header('Content-type: text/plain');
 
$data = unpack('S*', file_get_contents('il76c'));
 
define('SIZE', 64);
define('MASK', 1 << 14);
 
$kadr = array();
$n = $i = 0;
foreach ($data as $num)
{
    $kadr[] = $num;
    $i++;
    
    if ($num & MASK)
    {
        if (SIZE == $i)
        {
            $n++;
            //echo "Ок, у нас полный кадр в массиве \$kadr\n";
        }
        // else 
           // echo "Ошибка\n";
        $i = 0;
        $kadr = array(); // очищаем массив
    }
}
 
echo 'Всего кадров ' . $n;
0
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119
15.04.2013, 09:41  [ТС]
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
возможно 64 как раз чисел.
а 2 это байт на число...

но судя по тому что в 63 канале етсь 14 бит, значит явно больше 1го байта на канал.

попробуйте как то так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
header('Content-type: text/plain');
 
$data = unpack('S*', file_get_contents('il76c'));
 
define('SIZE', 64);
define('MASK', 1 << 14);
 
$kadr = array();
$n = $i = 0;
foreach ($data as $num)
{
    $kadr[] = $num;
    $i++;
    
    if ($num & MASK)
    {
        if (SIZE == $i)
        {
            $n++;
            //echo "Ок, у нас полный кадр в массиве \$kadr\n";
        }
        // else 
           // echo "Ошибка\n";
        $i = 0;
        $kadr = array(); // очищаем массив
    }
}
 
echo 'Всего кадров ' . $n;
Работает. Для маленького файла показало: Всего кадров 447
Для большого (il76c) показало ошибку:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20 bytes) in /var/www/kricha/data/www/troyan.dle-templates.info/3.php on line 5
Подскажите что вы кардинально сделали другого? Смотрю, вроде бы те же сравнениях, все кроме получения данных одинаковое.

Добавлено через 7 минут
1 канал = 1 значение, значит 2 байта на значение. + есть значения которые имеют десятичные значения, а есть, которые имеют значения "0", "1", труфолс, вот они по битам и определяются.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
16.04.2013, 22:27
Видимо памяти не хватило, в настройках пхп нужно увеличить память, либо в пхп прям
PHP
1
ini_set('memory_limit', '512M');
Ну или попробуйте так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 
header('Content-type: text/plain');
 
$fp = fopen('il76c', 'rb');
 
define('SIZE', 64);
define('MASK', 1 << 14);
 
$kadr = array();
$n = $i = 0;
while ($str = fread($fp, 2))
{
    $num = unpack('S', $str);
    $kadr[] = $num[1];
    $i++;
    
    if ($num[1] & MASK)
    {
        if (SIZE == $i)
        {
            $n++;
            //echo "Ок, у нас полный кадр в массиве \$kadr\n";
        }
        // else 
           // echo "Ошибка\n";
        $i = 0;
        $kadr = array(); // очищаем массив
    }
}
 
echo 'Всего кадров ' . $n;
0
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 119
16.04.2013, 22:46  [ТС]
А почему num[1]?
C вами можно как-то связаться, чтоб форум не засорять и быстрее связь поддерживать? Если да, напишите в ЛС.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
17.04.2013, 12:27
Цитата Сообщение от kRicha Посмотреть сообщение
А почему num[1]?
http://php.net/manual/ru/function.unpack.php
Возвращаемые значения
Возвращает ассоциативный массив, содержащий распакованные элементы бинарной строки.
Можно без анпак делать, как я писал выше, просто складывать байты.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
header('Content-type: text/plain');
 
$fp = fopen('il76c', 'rb');
 
define('SIZE', 64);
define('MASK', 1 << 14);
 
$kadr = array();
$n = $i = 0;
while ($str = fread($fp, 2))
{
    $kadr[] = $el = (ord($str[1]) << 8) | ord($str[0]);
    $i++;
    
    if ($el & MASK)
    {
        if (SIZE == $i)
        {
            $n++;
            //echo "Ок, у нас полный кадр в массиве \$kadr\n";
        }
        // else 
           // echo "Ошибка\n";
        $i = 0;
        $kadr = array(); // очищаем массив
    }
}
 
echo 'Всего кадров ' . $n;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2013, 12:27
Помогаю со студенческими работами здесь

Бинарное чтение файла
Что за каракули в конце файла,? Спасибо.

Бинарное чтение из файла с пoмощью функции fread()
Подскажите, пожалуйста, почему feof() может возвращать конец файла далеко до его реального конца? Конец проверяется из обозревателя файлов...

Максимально эфективное бинарное чтение из файла под Windows
Задача: максимально эфективно (быстро) читать данные из файла. Каким это будет происходить образом - в виде си функции, с++ или винапи...

Бинарное дерево поиска. Как осуществить запись в файл и чтение из файла
Добрый день! Если кому не жаль своего времени окажите помощь! Необходимо осуществить запись в файл,просмотр содержимого файла, и создание...

Бинарное чтение\ запись
Всем добрый вечер, ребята кто умеет и сталкивался с бинарным чтением и записью помогите отладить бинарную запись этой программы я там начал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru