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?
Trả lời
Độ 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 ở đó.
Xin lỗi, tôi muốn nói byte. Cảm ơn bạn đã giải thích. – Greg
Đ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. –
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.
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
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
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. –
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.
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.
- 1. Erlang chiều dài byte nhị phân
- 2. java.util.UUID.fromString không kiểm tra chiều dài
- 3. Kiểm tra Chiều dài đa chiều Mảng với Javascript
- 4. Java dài thành nhị phân
- 5. Tìm kiếm chuỗi nhị phân - chiều rộng thùng tối thiểu?
- 6. Chiều dài chuỗi bash
- 7. Kiểm tra chiều dài lĩnh vực sử dụng awk
- 8. kiểm tra chiều dài giá trị trường văn bản
- 9. PHPUnit kiểm tra dữ liệu nhị phân tải lên
- 10. Tạo một Jar kiểm tra nhị phân - Gradle
- 11. Nhận chiều dài của mảng chuỗi không rõ chiều dài
- 12. Clojure chiều dài của chuỗi
- 13. chiều dài chuỗi id facebook
- 14. Python: Tổng chiều dài chuỗi
- 15. Cách lấy chiều dài Chuỗi
- 16. Kiểm tra chuỗi con Java
- 17. Tính chiều dài của các đối tượng theo hình ảnh nhị phân - thuật toán
- 18. Ruby - Cách biểu diễn chiều dài tin nhắn là 2 byte nhị phân
- 19. Chuyển đổi chuỗi nhị phân thành mảng byte
- 20. Chiều dài chuỗi giữa các con trỏ
- 21. dài <-> str chuyển đổi nhị phân
- 22. Chuyển đổi chuỗi thập lục phân thành chuỗi nhị phân
- 23. tìm chiều dài của chuỗi số liên tiếp dài nhất
- 24. Chuỗi liên kết theo chiều dài COBOL
- 25. Qt - Lấy chiều dài pixel của một chuỗi trong QLabel
- 26. Phân tích tệp nhị phân trong Ruby
- 27. tất cả hoán vị của một chuỗi nhị phân x bit dài
- 28. "grep" offset của chuỗi ascii từ tệp nhị phân
- 29. Kiểm tra chuỗi con/chuỗi con gần đúng tồn tại trong một chuỗi dài hơn, bằng Python?
- 30. Việc kiểm tra xem chiều dài = 0 có nhanh hơn để so sánh nó với một chuỗi rỗng không?
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
@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