2010-07-14 4 views
5

Есть ли собственный или недорогой способ проверить длину строки в байтах на PHP?Проверьте длину двоичной строки?

+2

Есть ли у вас пример ваших данных? Потому что, если это действительно просто строка, я не думаю, что у вас есть альтернативы strlen(). – sunetos

+0

@sunetos Это строка, содержащая 16 байтов двоичных данных, для подключения в поле BINARY в MySQL. Это не кодированная символом строка из них и нулей или что-то в этом роде, если это прояснит ее. Если вы напечатаете строку, вы получите тарабарщину. Я хочу сделать проверку на наличие 16 байтов данных. – Greg

ответ

-4

Длина строки (текстовые данные) определяется положением символа NULL, который обозначает конец. В случае двоичных данных NULL может быть и часто находится посредине данных.

Вы не проверяете длину двоичных данных. Вы должны знать это заранее. В вашем случае длина равна 16 (байты, а не бит, если это UUID).

Что касается действительности UUID, любое 16-байтовое значение является допустимым UUID, поэтому вам там не повезло.

+0

Извинения, я хотел сказать байты. Спасибо, что объяснили. – Greg

+0

Это неверно. Было бы правильно, если PHP обрабатывал строки, такие как C, но, по-видимому, он имел некоторое предубеждение по этой точной проблеме. – 2012-10-02 21:43:51

2

На php.org, someone was nice enough to create this function. Просто умножьте на 8, и вы получили, однако, много бит в этой строке, поскольку функция возвращает байты.

+1

Так strlen должен эффективно работать нормально для строк, содержащих случайные двоичные данные? – Greg

+0

Я не думаю, что strlen дает вам что-либо, кроме количества символов, поэтому я связан с этим методом. Но даже этот метод выглядит так, как будто он предназначен для использования в строке, содержащей символы. – 31eee384

+0

Я думаю, что RiverC прибил его выше. Похоже, если вы используете mbstring.func: overload, вы теряете возможность обрабатывать двоичные данные с помощью обычных строковых функций PHP. –

16

См http://bytes.com/topic/php/answers/653733-binary-string-length

Соответствующая часть:

"В PHP, как и в C, строка заканчивается с нулевым символом '\ 0' (символ) 0, null-terminator, null-byte или что-то еще, что вы хотите назвать его. "

Нет, это не тот случай - PHP строка хранится как с длиной и данными , в отличии от C строк, которые только имеют один указатель и используют терминатор. Они «двоичный-безопасный» - NUL не завершает строку.

См. Определение zvalue_value в zend.h; строка имеет как «char * val», так и «int len».

Проблемы начнутся, если вы используете mbstring.func_overload, который изменяет как StrLen() и другие функции работают, и не пытаться лечить строки как строк символов в определенной кодировке, а не строка байт. Это не нормальное поведение PHP.

Ответ заключается в том, что strlen должен возвращать количество байтов независимо от содержимого строки. Для многобайтовых символьных строк вы получаете неправильное количество символов, но правильное количество байтов. Однако вам нужно быть уверенным, что вы не используете перегрузку mbstring, которая меняет поведение strlen.

2

В том случае, если вы MBstring набор перегрузки или ваш развиваются на платформах, где вы не уверены в том этой настройки вы можете сделать следующее:

$len=strlen(bin2hex($data))/2; 

Причина, почему это работает в том, что в Hex вас гарантированно получить 2 символа для всех байтов, которые поступают от bin2hex (он возвращает два символа даже для исходного двоичного кода 0).

Обратите внимание, что он будет использовать значительно больше ресурсов, чем нормальный strlen (Afterall, так что вы должны определенно не сделать это с большим количеством данных, если это не является абсолютно необходимым.