Russian Qt Forum
Ноябрь 26, 2024, 05:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: лень писать, хочу метод переворота байтов в переменной.  (Прочитано 13330 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #15 : Январь 17, 2012, 17:25 »

Скорее это
Цитировать
или я действительно что-то упускаю, ну оооочень жирное!!

 Подмигивающий


Записан

ArchLinux x86_64 / Win10 64 bit
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Январь 17, 2012, 17:25 »

пользуйся беззнаковыми (unsigned) целыми вместо знаковых, например quint16
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #17 : Январь 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);
 

как то так Улыбающийся
« Последнее редактирование: Январь 17, 2012, 17:32 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Январь 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 сам делает, вероятно не нужное
Записан
soulsaver
Гость
« Ответ #19 : Январь 18, 2012, 09:13 »

странно, но элемент массива (хоть это и один байт) QDataStream автоматом переводит в 32 битовое представление. Как сами кутековцы говорят. Почему свободное место заполняется FF а не нулями так и не смог вырвать из этих партизанов. Короче они сказали присваивайте необходимый элемент массива переменной типа unsigned char и все будет веником.) На вопрос а если я соединяю несколько байт, не буду ж я их пихать в однобайтную переменную, они опять промолчали. Так я пихал эти самые байты и в int и в char, в обоих случаях появляются загадочные FF. Получается придется читать по байту, пихать в unsigned char а потом их склеивать... не надо на меня так смотреть)))) сам не рад, но другого выхода не вижу. Или может у кого нить есть мысли по этому поводу?)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #20 : Январь 18, 2012, 09:18 »

Я тебе ссылку давал. Смотри метод writeHeader.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
soulsaver
Гость
« Ответ #21 : Январь 18, 2012, 09:32 »

Я тебе ссылку давал. Смотри метод writeHeader.
чет не нахожу такого метода(. хоть и скачал весь проэкт). не сразу заметил что вторая страница форму есть). тут действительно можно inlain использовать). кстати unsigned int тоже пробовал, история таже... FF... причем такая переменная весит 2 байта, а када ее в поток стреам кидаешь записывается 4 байта.)
« Последнее редактирование: Январь 18, 2012, 09:35 от soulsaver » Записан
BRE
Гость
« Ответ #22 : Январь 18, 2012, 09:36 »

не надо на меня так смотреть)))) сам не рад, но другого выхода не вижу. Или может у кого нить есть мысли по этому поводу?)
Тебе нужно один раз почитать и разобраться с целыми числами. Узнать как они храняться, чем отличаются знаковые от без знаковых, как они расширяются и таких вопросов больше не возникнет.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #23 : Январь 18, 2012, 09:37 »

Я тебе ссылку давал. Смотри метод writeHeader.
чет не нахожу такого метода
По ссылке строка 432.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
soulsaver
Гость
« Ответ #24 : Январь 18, 2012, 09:45 »

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


По ссылке строка 432.
[/quote]
   settings.setValue("Global/History", m_history); вот что выдает (. даже поиском по этому cpp шарю и ниче (. может у меня чего-то нет? )
Записан
BRE
Гость
« Ответ #26 : Январь 18, 2012, 09:52 »

Да я то вроде как помню все, учился давненько конечно.
Если тебя удивляет появление 0xFF при расширении отрицательного знакового числа, то наверное не все. Улыбающийся
Записан
soulsaver
Гость
« Ответ #27 : Январь 18, 2012, 11:03 »

qint16 решил все проблемы ).
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #28 : Январь 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;
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
soulsaver
Гость
« Ответ #29 : Январь 18, 2012, 11:32 »

Да, именно это мне и нужно было))). как на зло я увидел это когда уже разобрался((. Но все равно спасибо большое ).
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 23.