Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тип данных Byte 0-255 8 бит без знака 
:(
    Опции темы
yello
Дата 16.11.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Здравтвуйте.
Можно на perl использовать тип данных, 
Byte     0-255    8 бит  без знака (как на delphi).
Если да, то какой модуль использовать? 
PM MAIL   Вверх
arto
Дата 16.11.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



используйте.
модуль не требуется
PM MAIL ICQ   Вверх
shamber
Дата 16.11.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



pack
PM MAIL Jabber   Вверх
yello
Дата 17.11.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 байта.
PM MAIL   Вверх
Pfailed
Дата 17.11.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



А это не ip адрес?
В модуле Socket есть функция inet_aton($ip_or_hostname);
На выходе 4 байта получается.


--------------------
PM MAIL   Вверх
Pfailed
Дата 17.11.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


--------------------
PM MAIL   Вверх
amg
Дата 17.11.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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 байт.

Возможно, выход будет, если запакованное число (один байт) печатать прямо в сокет, без промежуточных присваиваний, а распаковывать на принимающей стороне.
PM MAIL   Вверх
Pfailed
Дата 17.11.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(amg @  17.11.2009,  11:49 Найти цитируемый пост)
В третьих, запакованное число, будучи присвоенное какой-либо переменной, скорее всего, превратится в строку, а однобайтная строка - это уже даже не 16 байт, а 29 байт.


Нет, вполне сохраняет свои свойства.


--------------------
PM MAIL   Вверх
amg
Дата 17.11.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Pfailed @  17.11.2009,  11:55 Найти цитируемый пост)
Нет, вполне сохраняет свои свойства.
Конечно сохраняет (то есть сказал то я все правильно, однобайтная строка в памяти занимает 29 байт, но не подумав, к обсуждаемому предмету это не относится). И печатать в сокет, наверное, без разницы, без промежуточных присваиваний или с ними, а вот распаковывать надо на принимающей стороне.

PM MAIL   Вверх
Pfailed
Дата 17.11.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(amg @  17.11.2009,  12:08 Найти цитируемый пост)
а вот распаковывать надо на принимающей стороне


Если как говорит автор у него на принимающей стороне сервер работает с 8-битными числами, то, как я понимаю, ничего распаковывать не придется.

Попробовал на всякий случай считать 8-битное число записанное c помощью pack в моем первом посте, в сишную 8-битную переменную.
Код

#include <stdio.h>

int main()
{
    FILE *input;
    char buf[1];
    
    input = fopen("dump", "r");
    if(input == NULL)
    {
        puts("wtf???");
        return 0;
    }
    
    fread(buf, 1, 1, input);
    fclose(input);
    
    printf("%d\n", buf[0]);
    
    return 0;
}


Результат удовлетворительный, печатает 127.

Это сообщение отредактировал(а) Pfailed - 17.11.2009, 13:06


--------------------
PM MAIL   Вверх
yello
Дата 17.11.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



отсылаемый пакет переменной длины и содержать может от 4 до 300 байт (оринтировочно), мне бы алгоритм понять
а массив @aref = (10,234,2,233) - это пример.
Причеи массив отсылается одним пакетом (далее проверяется контрольная сумма).
Можно часть кода написать на ассемблере, или на каком-нить другом языке, в скрипте перла, используя какой либо модуль?
PM MAIL   Вверх
KSURi
Дата 17.11.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



perldoc Inline


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Pfailed
Дата 17.11.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(yello @  17.11.2009,  18:26 Найти цитируемый пост)
мне бы алгоритм понять

Алгоритм чего?


--------------------
PM MAIL   Вверх
mvsgt
Дата 19.11.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Надо использовать pack. Только обратите внимание на порядок байтов в результате - кто знает, что Вам нужно?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.