![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| yello |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
Здравтвуйте.
Можно на perl использовать тип данных, Byte 0-255 8 бит без знака (как на delphi). Если да, то какой модуль использовать? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
используйте.
модуль не требуется |
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
pack
|
|||
|
||||
| yello |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
надо массив @aref = (10,234,2,233) отправить на сервер, через сокет (это я умею), и каждый элемент массива должен быть по размеру 1 байт и являться целым числом, т.е. мой массив @aref = (10,234,2,233) должен весить 4 байта, сервер входящий пакет записывает в память и считывает его побайтно, сервер не на перле, я не знаю можно ли пользоваться, pack/unpack, ведь сервер не будет распаковавать входящие данные, а работает с ними как с целыми числами
типа как в delphi: Byte 0-255 8 бит без знака мне бы в perl либо переменные и массив объявить как: Byte 0-255 8 бит без знака и с ними рабоать, тогда все просто, но тут только тип данных integer - 32 bit. пробую так, выдает иероглифы, а не целые числа(скорее всего я неправильно пакую) $aref[0] = pack 'C', $aref[0]; $aref[1] = pack 'C', $aref[1]; $aref[2] = pack 'C', $aref[2]; $aref[3] = pack 'C', $aref[3]; print "$aref[0]<br>"; print "$aref[1]<br>"; print "$aref[2]<br>"; print "$aref[3]<br>"; C - An unsigned char value. Only does bytes. See U for Unicode. как правильно запаковать и какой функцией можно измерить размер массива в байтах, чтобы убедиться что он весит 4 байта. |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
А это не ip адрес?
В модуле Socket есть функция inet_aton($ip_or_hostname); На выходе 4 байта получается. |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Глянул, pack('C', $smth) делает аналогичные действия.
Можно посмотреть в hex редакторе: pack("C", 127); Результат видно на картинке в аттаче. Это сообщение отредактировал(а) Pfailed - 17.11.2009, 11:46 Присоединённый файл ( Кол-во скачиваний: 10 )
______3.png 38,43 Kb |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Во-первых, в перле нельзя объявить число как Byte. В нем любое целое число, меньшее 2^32 (и 0 тоже), занимает 16 байт.
Во-вторых, печатать запакованную величину бкссмысленно, сначала ее нужно распаковать. $aref[0] = pack 'C', $aref[0]; print unpack('C', $aref[0]), "<br>"; В третьих, запакованное число, будучи присвоенное какой-либо переменной, скорее всего, превратится в строку, а однобайтная строка - это уже даже не 16 байт, а 29 байт. Возможно, выход будет, если запакованное число (один байт) печатать прямо в сокет, без промежуточных присваиваний, а распаковывать на принимающей стороне. |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
||||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Конечно сохраняет (то есть сказал то я все правильно, однобайтная строка в памяти занимает 29 байт, но не подумав, к обсуждаемому предмету это не относится). И печатать в сокет, наверное, без разницы, без промежуточных присваиваний или с ними, а вот распаковывать надо на принимающей стороне.
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Если как говорит автор у него на принимающей стороне сервер работает с 8-битными числами, то, как я понимаю, ничего распаковывать не придется. Попробовал на всякий случай считать 8-битное число записанное c помощью pack в моем первом посте, в сишную 8-битную переменную.
Результат удовлетворительный, печатает 127. Это сообщение отредактировал(а) Pfailed - 17.11.2009, 13:06 |
|||
|
||||
| yello |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.10.2009 Репутация: нет Всего: нет |
отсылаемый пакет переменной длины и содержать может от 4 до 300 байт (оринтировочно), мне бы алгоритм понять
а массив @aref = (10,234,2,233) - это пример. Причеи массив отсылается одним пакетом (далее проверяется контрольная сумма). Можно часть кода написать на ассемблере, или на каком-нить другом языке, в скрипте перла, используя какой либо модуль? |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
perldoc Inline
-------------------- Died at Life.pl line 21 |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
||||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Надо использовать pack. Только обратите внимание на порядок байтов в результате - кто знает, что Вам нужно?
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |