2010-07-14 42 views
5

Có cách nào có nguồn gốc hoặc rẻ tiền để kiểm tra độ dài của một chuỗi theo byte trong PHP không?Kiểm tra chiều dài chuỗi nhị phân?

+2

Bạn có một ví dụ về dữ liệu của bạn? Bởi vì nếu nó thực sự chỉ là một chuỗi, tôi không nghĩ rằng bạn có bất kỳ lựa chọn thay thế để strlen(). – sunetos

+0

@sunetos Đó là một chuỗi chứa 16 byte dữ liệu nhị phân, để cắm vào một trường BINARY trong MySQL. Nó không phải là một chuỗi ký tự được mã hoá ký tự và số không hoặc bất kỳ thứ gì giống như vậy, nếu điều đó làm rõ nó. Nếu bạn in chuỗi bạn nhận được vô nghĩa. Những gì tôi muốn làm là kiểm tra 16 byte dữ liệu. – Greg

Trả lời

-4

Độ dài của chuỗi (dữ liệu văn bản) được xác định bởi vị trí của ký tự NULL đánh dấu kết thúc. Trong trường hợp dữ liệu nhị phân, NULL có thể và thường nằm ở giữa dữ liệu.

Bạn không kiểm tra độ dài của dữ liệu nhị phân. Bạn phải biết nó trước. Trong trường hợp của bạn, chiều dài là 16 (byte, không phải bit, nếu nó là UUID).

Theo như giá trị UUID có liên quan, bất kỳ giá trị 16 byte nào là UUID hợp lệ, vì vậy bạn sẽ không may mắn ở đó.

+0

Xin lỗi, tôi muốn nói byte. Cảm ơn bạn đã giải thích. – Greg

+0

Điều này không đúng. Nó sẽ là chính xác nếu PHP đã xử lý các chuỗi như C, nhưng nó dường như đã có một số suy nghĩ về vấn đề chính xác này. –

2

Trên php.org, someone was nice enough to create this function. Chỉ nhân với 8 và bạn đã có nhiều bit trong chuỗi đó, vì hàm trả về byte.

+1

Vì vậy, strlen nên hiệu quả làm việc tốt cho các chuỗi giữ dữ liệu nhị phân ngẫu nhiên? – Greg

+0

Tôi không nghĩ rằng strlen cung cấp cho bạn bất cứ điều gì nhưng số lượng ký tự, đó là lý do tại sao tôi liên kết với phương pháp đó. Nhưng ngay cả phương pháp đó trông giống như nó được thiết kế để được sử dụng trên một chuỗi có chứa các ký tự. – 31eee384

+0

Tôi nghĩ RiverC đã đóng đinh nó ở trên. Có vẻ như nếu bạn sử dụng mbstring.func: overload, bạn sẽ mất khả năng xử lý dữ liệu nhị phân với các hàm chuỗi PHP thông thường. –

16

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

phần liên quan:

"Trong PHP, giống như trong C, chuỗi kết thúc bằng một ký tự không, '\ 0', (char) 0, null-terminator, null-byte hoặc bất cứ điều gì bạn muốn gọi nó là. "

Không, đó không phải là trường hợp - chuỗi PHP được lưu trữ với cả chiều dài và dữ liệu, không giống như các chuỗi C mà chỉ có một con trỏ và sử dụng một terminator. Chúng là "an toàn nhị phân" - NUL không chấm dứt chuỗi.

Xem định nghĩa của zvalue_value trong zend.h; phần chuỗi có cả "char * val" và "int len".

Sự cố sẽ bắt đầu nếu bạn đang sử dụng mbstring.func_overload, thay đổi cách strlen() và các chức năng khác hoạt động, và cố gắng xử lý chuỗi như chuỗi ký tự trong một mã hóa cụ thể thay vì chuỗi byte. Đây không phải là hành vi PHP bình thường.

Câu trả lời là strlen phải trả lại số byte bất kể nội dung của chuỗi. Đối với chuỗi ký tự nhiều byte, bạn nhận được số ký tự sai, nhưng số byte phải. Tuy nhiên, bạn cần chắc chắn rằng bạn không sử dụng quá tải mbstring, điều này thay đổi cách hoạt động của strlen.

2

Trong trường hợp bạn đã mbstring quá tải bộ hoặc bạn đang phát triển cho các nền tảng mà bạn không chắc chắn về điều này thiết lập mà bạn có thể làm như sau:

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

Lý do tại sao các công trình này là trong Hex bạn được đảm bảo nhận được 2 ký tự cho tất cả các byte đến từ bin2hex (nó trả về hai ký tự ngay cả đối với số nhị phân ban đầu 0).

Lưu ý rằng nó sẽ sử dụng nhiều hơn đáng kể tài nguyên hơn bình thường strlen (sau tất cả, vì vậy bạn nên chắc chắn không phải làm điều đó với số lượng lớn dữ liệu nếu nó không phải là hoàn toàn cần thiết.

Các vấn đề liên quan