Поле начинающееся с chr(0)

Роберт

Аналитик
Поле начинающееся с chr(0)

Работаю с .dbf файлами , которые поступают от клиентов.
И есть там одно поле типа Chracter в которое вносено название объекта , но первый символ этого поля - тип объекта.
Если этот символ chr(1) - это терминальный объект , если chr(2) - это ресурс управления , и так далее...
Проблема возникает когда первый символ chr(0) так как в этом случае строку прочесть невозможно. PHP считает что получил от базы данных строку нулевой длинны. Может кому-нибудь приходилось работать с бинарными данными в .dbf файлах? Как прочитать такую запись?
 

WP

^_^
А каким образом работаешь? Т.е. что выполняет функцию драйвера?
 

Gorynych

Посетитель PHP-Клуба
Роберт
символ с кодом 0 это традиционный zero-terminate string, т.е. воспринимается это дело как заканчивающаяся нулем строка.

варианты:

1) если читаем файл самостоятельно, пользуясь функциями чтения из файла, то читать не построчно а блоками и разбирать прочитанное уже в скрипте - http://php.net/fread

2) читать как и раньше, считая что если встретилась пустая строка нулевой длины и данные продолжают читаться, то это встретился символ с кодом 0.

я даже думаю, что второй вариант Вам ближе, вы же наверняка читаете запись в которой одно из полей для вас оказывается пустой строкой нулевой длины. Ну так и считайте что это поле заполнено символом с кодом 0 (хотя вообще зря был такой маркер для типов данных применен, кто-то явно не знал к чему это потом приведет :)
 

Роберт

Аналитик
Увы , но как они там когда-то придумали так работает и сейчас , а мне всего лишь веб интерфейс для отображения надо было сделать.
Я с .DBF таблицей работаю через библиотеку php_dbase.dll которая входит в комплект PHP (уж больно там много полей чтобы работать с ней как с бинарным файлом).
Сейчас сделал так - копирую файл к себе , увеличиваю длнну этого поля на 1 символ и написал несколько строк , которые пробегают по всему файлу-таблице в бинарном режиме и если видят что там первый стоит chr(0) - то пишет вместо него и в самую последнюю дополнительную ячейку символ chr(1). Ну а дальше при считывании - если поле начинается и заканчивается на chr(1) - значит это тип 0...
Получается очень некрасиво , но работает...

А может у кого-то есть какие-то идеи как сделать красивей? Или думаете что это уже на уровне php_dbase.dll строка считается пустой если начинается с chr(0)?
 

Роберт

Аналитик
baev
Ну это почти тоже самое что и dbase_get_header_info()
А что? Структуру файла и так на ходу подхватываю так как длинна полей от разных источников иногда различается (а у некоторых ещё дополнительные поля есть).
 
Сверху