PHP пакет двоичных данных - PullRequest
1 голос
/ 11 ноября 2010

Это относится к данным, отправляемым через сокет в приложение C, находящееся в удаленной системе POS.

Двоичные данные отправляются из приложения php, в структуре пакета приложения C хранится 64 байта для строки, например. название продукта.

Теперь, когда я отправляю название продукта по сети через php-сокеты, я использую пакет для преобразования данных в двоичный файл

$value = 'product name' 
$qty = 2;
$len = strlen($value);
$output = '';
for($i=0; $i<$len; $i++) {
        $output .= pack('c', ord(substr($value, $i, 1))).pack('c',$qty) 
}

Когда данные получены приложением C, строка содержит много мусорных данных, включая цифры и специальные символы.

Какие параметры упаковки я должен использовать, чтобы упаковать имя продукта в двоичную строку размером 64 байта, которая будет интерпретироваться приложением C в правильном формате.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2010

Ваш цикл для сборки $output создает строку типа "p\x02r\x02o\x02d\x02u\x02c\x02t\x02 \x02n\x02a\x02m\x02e\x02"

Если ваша C-программа ожидает что-то вроде "product name\0\x02", тогда цикл должен быть:

$output = '';
for($i=0; $i<$len; $i++) {
        $output .= pack('c', ord(substr($value, $i, 1))); 
}
$output .= pack('c',0).pack('c',$qty);
0 голосов
/ 11 ноября 2010

Отправка двоичных данных через сетевые сокеты также может создать проблемы с упорядочением байтов (Endianess), вы можете проверить, является ли порядок следования байтов одинаковым в обеих системах. http://en.wikipedia.org/wiki/Endianness

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...