2015-06-10 3 views
0

Если я прочитал двоичный файл в переменной, используя $data = fread('myfile','rb'), как я могу работать через $data байт за раз. Я также хочу выполнять операции над каждым байтом, например, умножать его на число и вычислять по модулю относительно другого числа.Байт-арифметика и манипуляция строкой PHP

Я могу ссылаться на переменную как на массив, используя $data[$i], но я получаю байты с этим или, возможно, многобайтовыми символами? Также, когда я это делаю, я не могу выполнять вычисления по результатам, например $data[$i]*4, который всегда равен нулю.

Мне нужна работа с очень большими файлами, поэтому решение должно быть быстрым.

Благодаря

+0

Возможный дубликат [PHP-файл для чтения в виде массива байтов] (http://stackoverflow.com/questions/17963110/php-read-file-as-an-array-of-bytes) – michaelbn

ответ

1

я могу ссылаться на переменную как массив, используя $ данных [$ я], но я получаю байты с этим или, возможно, многобайтовые символы?

Вы получите байты. Строки PHP однобайтовые.

Также, когда я это делаю, я не могу выполнять вычисления по результатам, такие как $ data [$ i] * 4, который всегда равен нулю.

Преобразование символа в ряд с ord, сделать свои расчеты и, при необходимости, конвертировать обратно с chr. Альтернативно, конвертируйте весь буфер с unpack('c*', $buf), который дает вам числовой массив.

+0

Какой вид накладных расходов есть ли с ордом и распаковать? Я видел эти функции, но отклонил их, поскольку я предположил, что они будут очень медленными. – Dom

+0

Я сделал очень грубый бенчмаркинг, который показал, что ни ord, ни распаковка не бывают быстрыми (примерно на секунду на мега на моей машине разработки). Распаковка смехотворно дорого с точки зрения памяти, используя в 200 раз больше памяти, которая распакована. Поскольку данные были прочитаны в переменной, она существует как байты в памяти, нет ли метода нижнего уровня для прямого доступа к нему? – Dom

+0

@Dom: 'ord' - очень простая функция и работает так же быстро, как и получается. Если вы хотите, чтобы ваш цикл был еще быстрее, вам, вероятно, нужен скомпилированный язык, например C. – georg

Смежные вопросы