Russian Qt Forum

Qt => Общие вопросы => Тема начата: soulsaver от Январь 17, 2012, 10:24



Название: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 10:24
Есть ли что нить такое в qt? типо хлоп и число int i;  которое равно 3 и в шеснадцатиричном виде выглядит так 00 00 00 03, превращается вот в это 03 00 00 00. жизню бы проще на много щас сделало мне. Мечта - функция в качестве аргумента принимает инт, а возвращает его же, но перевернутый ))). Спасибо биг заранее.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Bepec от Январь 17, 2012, 10:32
Лень отвечать, хочу петушка на палочке и стакан холодного сока.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 10:33
а где-то еще есть питухи на палках? я думал они в сссре остались). ну а если честно, можешь что нить подсказать?


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 17, 2012, 10:48
qToBigEndian, qToLittleEndian


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: ecspertiza от Январь 17, 2012, 10:54
а где-то еще есть питухи на палках? я думал они в сссре остались).

офф. у нас в супермаркетах "Сота" продаются. сам периодически балуюсь.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 10:58
qToBigEndian, qToLittleEndian
есть контакт. легко и просто. класс. спасибо большое, опять выручил меня. Большое человеческое спасибо, теперь мона работать и радоваться)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: kambala от Январь 17, 2012, 11:34
если ты пишешь данные в QDataStream, то ему просто надо выставить setEndianess(QDataStream::LittleEndian) и все преобразования будут выполняться автоматически


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 11:44
если ты пишешь данные в QDataStream, то ему просто надо выставить setEndianess(QDataStream::LittleEndian) и все преобразования будут выполняться автоматически
тоже кул совет). кому нить понадобится, уверен. Но тот мозг который делал структуру dbf3 перевернул все байты в заголовках а имена полей и значения записей нормально вкорячил. и еще некоторые значения там не перевернутые есть, лучше функцией в цикле писать), ну по крайней мере именно в этом случае и именно по моему мнению)). но все равно спасибо, хорошая штука тоже, уверен.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 17, 2012, 11:55
QDBFRedactor (https://github.com/panter-dsd/QDBFRedactor) - посмотри, может что-то полезное найдешь. Это я когда-то по работе писал.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Akon от Январь 17, 2012, 13:08
std::reverse<>()


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 14:34
QDBFRedactor (https://github.com/panter-dsd/QDBFRedactor) - посмотри, может что-то полезное найдешь. Это я когда-то по работе писал.
спасибо )) поглядим). бедняга, тебя полноценный редактор заставили стряпать.. ) мне только выборку и запись по статическому запросу), но все равно общего много. респект тебе.)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 14:37
std::reverse<>()
пасип) и это потестим). правда тут лишний заголовочный придется подключать). но если вдруг писать консольную прогу как раз кстати будет.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 17, 2012, 14:37
спасибо )) поглядим). бедняга, тебя полноценный редактор заставили стряпать.. ) мне только выборку и запись по статическому запросу), но все равно общего много. респект тебе.)
Не заставляли - сам сделал. Просто нет нормальных кроссплатформенных свободных редакторов DBF. Жаль, что так и не закончил.


Название: Re: лень писать, хочу метод переворота байтов
Отправлено: soulsaver от Январь 17, 2012, 14:50
сори что в этой же теме.. но у меня походу мозг уже не пашет, короче перевернутое 32х битное int число считываю побайтно и склеиваю его с помощью оператора смещения(dbfInfo это QByteArray):
Код
C++ (Qt)
dbfRecordsNumb = dbfInfo.at(4) + (dbfInfo.at(5) << 8) + (dbfInfo.at(6) << 16) + (dbfInfo.at(7) << 24);
 
все пучком пашет. считываю 16ти битное int число (тоже перевертыш):
Код
C++ (Qt)
dbfHeaderSize=dbfInfo.at(8)+ (dbfInfo.at(9)<< 8);
 
получаю какой-то бред, даже не могу понять откуда он это берет.... то что в этих индексах массива байтов лежат именно те байты которые мне нужны я уверен, проверил раз 700.))) уверен что-то глупое является причиной, только не могу этого увидить, сори за растерянность заранее(.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 17, 2012, 16:22
ужас)). короче исходные байты 81 00, после переворота показанного выше должно получиться 00 81, но получается FF FF FF 81... причем если я даже записываю в файл байт:
Код:
QDataStream<<dbfInfo.at(8);
(в нем находится значение 81) записывается не 81, и даже не FF 81 а FF FF FF 81.... это значит хватит работать? у меня параноя? или я нашел баг Qt? или я действительно что-то упускаю, ну оооочень жирное!!


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: kuzulis от Январь 17, 2012, 17:25
Скорее это
Цитировать
или я действительно что-то упускаю, ну оооочень жирное!!

 ;)




Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: kambala от Январь 17, 2012, 17:25
пользуйся беззнаковыми (unsigned) целыми вместо знаковых, например quint16


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: kuzulis от Январь 17, 2012, 17:26
Дада, это "АЗБУКА"  :)

Цитировать
пользуйся беззнаковыми (unsigned) целыми вместо знаковых, например quint16
или маскируй свои сдвиги, или плюсуй по очереди, т.е.:
вместо:
Код
C++ (Qt)
dbfHeaderSize=dbfInfo.at(8)+ (dbfInfo.at(9)<< 8);
 

надо:
Код
C++ (Qt)
dbfHeaderSize = (dbfInfo.at(9)<< 8) & 0xFF00;
dbfHeaderSize += dbfInfo.at(8);
 

как то так :)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Igors от Январь 17, 2012, 18:29
ужас)). короче исходные байты 81 00, после переворота показанного выше должно получиться 00 81, но получается FF FF FF 81... причем если я даже записываю в файл байт:
Код:
QDataStream<<dbfInfo.at(8);
(в нем находится значение 81) записывается не 81, и даже не FF 81 а FF FF FF 81.... это значит хватит работать? у меня параноя? или я нашел баг Qt? или я действительно что-то упускаю, ну оооочень жирное!!
char - signed (знаковый), ну отрицательное int число и получается (в "дополнительном коде"). Для таких склеек хороши inline, напр
Код
C++ (Qt)
inline unsigned short MkUShort( unsigned short lo. unsigned short hi )
{
return lo | (hi << 8);
}
 
А вообще создается впечатление - делается то что QDataStream сам делает, вероятно не нужное


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 09:13
странно, но элемент массива (хоть это и один байт) QDataStream автоматом переводит в 32 битовое представление. Как сами кутековцы говорят. Почему свободное место заполняется FF а не нулями так и не смог вырвать из этих партизанов. Короче они сказали присваивайте необходимый элемент массива переменной типа unsigned char и все будет веником.) На вопрос а если я соединяю несколько байт, не буду ж я их пихать в однобайтную переменную, они опять промолчали. Так я пихал эти самые байты и в int и в char, в обоих случаях появляются загадочные FF. Получается придется читать по байту, пихать в unsigned char а потом их склеивать... не надо на меня так смотреть)))) сам не рад, но другого выхода не вижу. Или может у кого нить есть мысли по этому поводу?)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 18, 2012, 09:18
Я тебе ссылку давал (https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactor.cpp). Смотри метод writeHeader.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 09:32
Я тебе ссылку давал (https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactor.cpp). Смотри метод writeHeader.
чет не нахожу такого метода(. хоть и скачал весь проэкт). не сразу заметил что вторая страница форму есть). тут действительно можно inlain использовать). кстати unsigned int тоже пробовал, история таже... FF... причем такая переменная весит 2 байта, а када ее в поток стреам кидаешь записывается 4 байта.)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: BRE от Январь 18, 2012, 09:36
не надо на меня так смотреть)))) сам не рад, но другого выхода не вижу. Или может у кого нить есть мысли по этому поводу?)
Тебе нужно один раз почитать и разобраться с целыми числами. Узнать как они храняться, чем отличаются знаковые от без знаковых, как они расширяются и таких вопросов больше не возникнет.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 18, 2012, 09:37
Я тебе ссылку давал (https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactor.cpp). Смотри метод writeHeader.
чет не нахожу такого метода
По ссылке строка 432.


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 09:45
Тебе нужно один раз почитать и разобраться с целыми числами. Узнать как они храняться, чем отличаются знаковые от без знаковых, как они расширяются и таких вопросов больше не возникнет.
Да я то вроде как помню все, учился давненько конечно. Просто работаю специалистом по тех обслуживанию 9 лет уже, винду ставлю, картриджи меняю, кабельки эзернет обжимаю, никого не трогаю, а тут хлоп и такое задание от начальства, по этому как-то и не могу вклиниться в программирование ), не сердчай на меня ).


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 09:48

По ссылке строка 432.
[/quote]
   settings.setValue("Global/History", m_history); вот что выдает (. даже поиском по этому cpp шарю и ниче (. может у меня чего-то нет? )


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: BRE от Январь 18, 2012, 09:52
Да я то вроде как помню все, учился давненько конечно.
Если тебя удивляет появление 0xFF при расширении отрицательного знакового числа, то наверное не все. :)


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 11:03
qint16 решил все проблемы ).


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: Пантер от Январь 18, 2012, 11:05

По ссылке строка 432.
   settings.setValue("Global/History", m_history); вот что выдает (. даже поиском по этому cpp шарю и ниче (. может у меня чего-то нет? )
[/quote]
Код
C++ (Qt)
void DBFRedactor::writeHeader()
{
if (m_openMode != Write)
return;
 
char *c = new char[33];
for (int i = 0; i < 32; i++)
c[i] = 0;
char *tmp = c;
 
c[0] = 0x3;
c[1] = header.lastUpdated.toString("yy").toShort();
c[2] = header.lastUpdated.month();
c[3] = header.lastUpdated.day();
tmp += 4;
*(qint32*)tmp = header.recordsCount;
tmp += 4;
*(qint16*)tmp = header.firstRecordPos;
tmp += 2;
*(qint16*)tmp = header.recordLenght;
m_file.seek(0);
m_file.write(c, 32);
delete [] c;
}
 


Название: Re: лень писать, хочу метод переворота байтов в переменной.
Отправлено: soulsaver от Январь 18, 2012, 11:32
Да, именно это мне и нужно было))). как на зло я увидел это когда уже разобрался((. Но все равно спасибо большое ).