![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
Такая ситуация... Есть "кусок фаила", в нем структура из N байт такого плана: первые 5 бит (именно бит) - кол-во бит, используемых для описания четырех остальных параметров, и дальше, собственно, эти самые 4 параметра. Т.е. к примеру:
![]() Здесь первые 5 бит - 00011, 3, тобишь, т.е. по 3 бита на остальные 4 параметра. То, что отмечено серым - не используется. У меня оно делается примерно так:
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Если "buf" - буфер (массив) из 3-х байт, расположенных по приведенной схеме (т.е. buf[0] - самый левый, а buf[2] - самый правый), то вытянуть все 5 параметров и раскидать по переменным "param1...param5" можно вот так:
Это сообщение отредактировал(а) mr.DUDA - 5.9.2003, 17:58 -------------------- ![]() |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
дык в том-то и дело, что первые 5 бит могут быть 11111, т.е. 31, тогда вся структура будет занимать 17 баит. Вариант, который я привел - один из самых простых
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
То есть я так понимаю, нужна функция типа "unsigned long GetBits(int istart, iend, char *buf)"
Если да, то напишу завтра -------------------- ![]() |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Вот и обещанный сорц:
ЗЫ, наверное ещё как-то можно через std::bitset, но я не знаю как. -------------------- ![]() |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
mr.DUDA, thnx, буду пробывать. У меня самого в пятницу после употребления литра пива алгоритм на PHP родился на эту тему. Только тормозить будет...
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
mr.DUDA, с такой, например, вещью уже не катит...
![]() Т.е. если размер параметра больше 8 бит (т.е. занимает от 2 до 3 байт), то тут уже не получается... -------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Сорри, теперь всё работает Ok:
ЗЫ, ну и шрифт тут... Пришлось убрать из поста маркеры границ битов... Это сообщение отредактировал(а) mr.DUDA - 8.9.2003, 11:17 -------------------- ![]() |
|||
|
||||
| MuToGeN |
|
||||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
Вот как я это сделал на PHP:
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
||||
|
|||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
mr.DUDA, огромное спасибо за помощь
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Хех, это напомнило мне, как я сделал деление в столбик с помощью строковых операций -------------------- ![]() |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
Все... дальше на PHP мучиться смысла нет... Пытаюсь более детально разобраться с алгоритмом на C++
Есть где-то в буфере байт... Интересуют нас оттуда биты с 3 по 5 включительно, т.е. leftBitInByte = 3, rightBitInByte = 5... Имеем: leftMask = 00011111 rightMask = 11111100 left & right = 00011100 Пусть байт в буфере = 0xFF Тогда result = 00011100 >> (7 - 5) = 00011100 >> 2 = 00000111 -------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Ты всё понял правильно
Отличия второго варианта (после else) состоят в том, что вначале в result записывается "кусок" от левого бита до края первого байта, затем идёт цикл добавления в результат "полных" байт (если таковые есть), и потом - "кусок" от края последнего байта до правого бита. -------------------- ![]() |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
Вопрос на ту же тему... Насчет бита знака... То, что написал тогда - пахать не хочет, отвык я от C++...
Для типа int - какой бит отвечает за знак? Насколько помню, самый верхний... А как грамотно его преобразовать из битовой последовательности? Допусим, есть значения из пяти бит - 01101 - 13 в десятичной и 11101 - . Насколько понял, чтобы преобразовать его в signed int, надо "продублировать" верхний бит из пятибитовой последовательности, т.е. 01101 => 00000000 00000000 00000000 00001101 11101 => 11111111 11111111 11111111 11111101 Я прав? -------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Ты прав. Вот тебе функция, преобразующая результат функции ReadParams в знаковое число, если бит знака находится в позиции iBitSign:
ЗЫ, отсчет битов по-прежнему идёт слева-направо. ЗЫ(2), "int" то же самое что "long" (32-разрядное целое со знаком), но не обязательно и не на всех платформах. Я предпочёл бы юзать "long" (хотя, ты можешь делать как хочешь, или как удобнее - ничего от этого не изменится). Это сообщение отредактировал(а) mr.DUDA - 8.9.2003, 20:31 -------------------- ![]() |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |