Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужен PHP аналог фунции Delphi "IdTCPClient1.WriteInteger(0);"

434
11 ноября 2011 года
Poltos
105 / / 18.08.2004
Добрый день!

Есть серверное приложение, написанное на Дельфи с использованием компонент [Indy], для работы с tcp.
Необходимо разработать на php пару функций от данного программного комплекса.


Я коннекчусь (на php) к приложению с помощью сокетов. С отправкой/получением строковых данных нет проблем, а вот число не получается передать в том виде в котором оно есть на серверном приложении. Не могу понять как преобразовать число к необходимому формату.
Сама задача такова, при отправке текстовых данных на сервер нужно отправить их длину в виде 4х байт.

На вот как на дельфи клиентское приложение отправляет число:
 
Код:
IdTCPClient1.WriteInteger(Length(mRepParams.Text));


я перепробовал разные способы, но что-то не то.
пробовал функции: pack, bin2hex, даже ord и chr

Помогите разобраться, может вообще не сокеты использовать?
12
11 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Данные на сокете не более чем поток байт. Поэтому определись/разберись с тем, в каком виде delphi ждет эти самые "числа". Потому как число это абстракция, а работать нужно с конкретным представлением (float, int, прямой порядок байт, обратный порядок, unsigned... и т.д.).
74K
12 ноября 2011 года
OlegSobachnik
14 / / 11.11.2011
Попробуй так:
 
Код:
$length = 112345; // Некое число типа int, которое ты хочешь передать четырьмя байтами
$j = 4;
$str = '';
while($j--) {
    $x = 0xFFFFFF00 ^ (0xFFFFFF00 | ($length >> 24));
    $length = $length << 8;
    $str .= chr($x);
}
// Теперь оно в $str...
//file_put_contents('file.txt', $str);

Это работает, если php работает на 32-битной системе. Если там 64 бит, то, наверно, придётся переделывать, так как тогда там integer будет храниться не в 4-х а в 8-ми байтах, я думаю.
12
13 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: OlegSobachnik

Это работает, если php работает на 32-битной системе. Если там 64 бит, то, наверно, придётся переделывать, так как тогда там integer будет храниться не в 4-х а в 8-ми байтах, я думаю.


Цитата:
The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.


PHP Docs - Integers

74K
13 ноября 2011 года
OlegSobachnik
14 / / 11.11.2011
Ясно. Ок. Буду знать :)
434
14 ноября 2011 года
Poltos
105 / / 18.08.2004
Спасибо! Буду тестировать.
434
14 ноября 2011 года
Poltos
105 / / 18.08.2004
Цитата: OlegSobachnik
Попробуй так:
 
Код:
$length = 112345; // Некое число типа int, которое ты хочешь передать четырьмя байтами
$j = 4;
$str = '';
while($j--) {
    $x = 0xFFFFFF00 ^ (0xFFFFFF00 | ($length >> 24));
    $length = $length << 8;
    $str .= chr($x);
}
// Теперь оно в $str...
//file_put_contents('file.txt', $str);

Это работает, если php работает на 32-битной системе. Если там 64 бит, то, наверно, придётся переделывать, так как тогда там integer будет храниться не в 4-х а в 8-ми байтах, я думаю.



Помог данный код!)

Теперь другая проблема, я данные с сервера получаю, нужен обратный алгоритм, не понимаю я с этими смещениями(( что там куда.
Ответ приходит в бинарном виде: [длина данных 8 байт][данные]

12
14 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Poltos

Ответ приходит в бинарном виде: [длина данных 8 байт][данные]


unpack тебе в руки. Только для начала нужно четко понимать, что конкретно за первые 8 байт и какова структуру последующих данных.

434
15 ноября 2011 года
Poltos
105 / / 18.08.2004
Цитата: alekciy
unpack тебе в руки. Только для начала нужно четко понимать, что конкретно за первые 8 байт и какова структуру последующих данных.



unpack нужно к целой строке применять или посимвольно?

12
15 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Poltos
unpack нужно к целой строке применять или посимвольно?


Тут не может быть ни каких "посимвольно", ты же с потом байт работаешь! Максимум что есть это бинарная строка, но ни как не строка.

unpack применяется к тому куску данных которые у тебя в данное время есть и структуру которых ты знаешь. Для "[длина данных 8 байт][данные]" возможно пойдет такой вариант "c8header/*data", где с - signed (знаковых) байт, 8 - соответственно восемь того что слева от восьмерки, т.е. в итоге "8 знаковых байт", header - имя ключа в возвращаемом ассоциативном массиве, * - все остальные данные до конца, data - имя ключа в массиве. Привожу для примера ибо точное описание можно составить только точно зная формат бинарных данных.

На последок замечу, что PHP и бинарные данные вещи не очень согласующиеся, не под эти цели язык заточен. В том же erlang матчинг бинарных делается намного удобнее и более богат по возможностям.

434
15 ноября 2011 года
Poltos
105 / / 18.08.2004
Цитата: alekciy
Тут не может быть ни каких "посимвольно", ты же с потом байт работаешь! Максимум что есть это бинарная строка, но ни как не строка.

unpack применяется к тому куску данных которые у тебя в данное время есть и структуру которых ты знаешь. Для "[длина данных 8 байт][данные]" возможно пойдет такой вариант "c8header/*data", где с - signed (знаковых) байт, 8 - соответственно восемь того что слева от восьмерки, т.е. в итоге "8 знаковых байт", header - имя ключа в возвращаемом ассоциативном массиве, * - все остальные данные до конца, data - имя ключа в массиве. Привожу для примера ибо точное описание можно составить только точно зная формат бинарных данных.

На последок замечу, что PHP и бинарные данные вещи не очень согласующиеся, не под эти цели язык заточен. В том же erlang матчинг бинарных делается намного удобнее и более богат по возможностям.



С этим все понятно, пасиб.

Еще вышло у меня недопонимание с нашим программистом, [длина данных 8 байт][данные], тут в 8 байтах зашита длинна (int64) в качестве контрольной суммы данных, а остальное как есть нужно записать в файл без изменений. Я же изначально понял, что [данные] это string и гонял бинарную строку туда-сюда...

Спасибо большое за помощь!


п.с.
со смещениями все равно ничего не понял...)

 
Код:
// ...
$x = 0xFFFFFF00 ^ (0xFFFFFF00 | ($length >> 24));
$length = $length << 8;
74K
16 ноября 2011 года
OlegSobachnik
14 / / 11.11.2011
Я не знаю такой функции в PHP (хотя пишу на нём много и часто, это моя работа), которая преобразовывала бы байт-код (назовём это так, возможно, оно так и называется) целого числа в строку.
Просто php - такая штука, он всё-таки в первую очередь предназначен для обработки текстов. Можно даже удивиться, что в нём вообще есть такие операторы, как сдвиг битов вправо/влево и прочие побитовые операторы. За всё время, что я с ним работаю, мне эти операторы, собственно, ни разу и не требовались. Разве что только в учебно-экспериментальных целях, да вот тут, на форуме подсказать :-)))
Ну а чтобы пояснить, что делает этот цикл - придётся также пояснять, как хранится в памяти целочисленный int, а также, что есть текстовая строка. Это длинно, сейчас лень. Но если очень надо - можно попробовать конечно, как-нибудь.
434
16 ноября 2011 года
Poltos
105 / / 18.08.2004
Цитата: OlegSobachnik
Я не знаю такой функции в PHP (хотя пишу на нём много и часто, это моя работа), которая преобразовывала бы байт-код (назовём это так, возможно, оно так и называется) целого числа в строку.
Просто php - такая штука, он всё-таки в первую очередь предназначен для обработки текстов. Можно даже удивиться, что в нём вообще есть такие операторы, как сдвиг битов вправо/влево и прочие побитовые операторы. За всё время, что я с ним работаю, мне эти операторы, собственно, ни разу и не требовались. Разве что только в учебно-экспериментальных целях, да вот тут, на форуме подсказать :-)))
Ну а чтобы пояснить, что делает этот цикл - придётся также пояснять, как хранится в памяти целочисленный int, а также, что есть текстовая строка. Это длинно, сейчас лень. Но если очень надо - можно попробовать конечно, как-нибудь.



Я примерно понимаю, просто не сталкивался с этим... разъяснять не нужно, я доки почитаю.

12
16 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: OlegSobachnik
Я не знаю такой функции в PHP (хотя пишу на нём много и часто, это моя работа), которая преобразовывала бы байт-код (назовём это так, возможно, оно так и называется) целого числа в строку.


Бинарной строкой обычно называют. Вопрос преобразования решается обычно через связку pack/unpack.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог