Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

побайтная запись __int64

538
26 марта 2013 года
AVDEY
188 / / 17.11.2005
Здравствуйте.
У меня с устройства считываться данные блоками по 51-байт, с них 6-байт беззнаковое целое.
Надо этих 6-байт их запихнуть в переменную __int64.

Пробую так:
 
Код:
unsigned __int64 f=0x44|0x79<<8|0xf8<<16|0x34<<24|0xff<<32|0xab<<40;
Компилятор MVSC6.0 и MinGW(Qt 4.8.1)
Последние 2 байта отбрасываются.
Вывожу:
 
Код:
MVSC
printf("a=%164d\n",f); или
printf("a=%X\n",f);  

Qt
qDebug()<<f;
qDebug()<<qDebug()<<QString::number(a,16);
260
26 марта 2013 года
Ramon
1.1K / / 16.08.2003
RTFM printf, stdint.h
538
26 марта 2013 года
AVDEY
188 / / 17.11.2005
Может я вас не правильно понял, но мне такая запись не подходит:
unsigned __int64 a=0xffffffffffffffffULL;
unsigned __int64 a=UINT64_C(18446744073709551615);
у меня єсть масив uchar 6байт и его надо записать в unsigned __unt64;
260
26 марта 2013 года
Ramon
1.1K / / 16.08.2003
В таком случае откройте для себя приведение типов.
538
27 марта 2013 года
AVDEY
188 / / 17.11.2005
Цитата:
"Толи я тупой то ли лыжи не едут".


Мне надо записать в переменную _int64 байти со сдвигом. Поскольку последовательность может быть от младшего к старшему и от старшего к младшему байт.
ну например:

 
Код:
uchar buf[10];
ulong dw;
__int 64 a;
      ReadFile(hPort,&buf,10,&dw,NULL);

if(buf[0]==0xAA)
a=buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24|buf[5]<<32|buf[6]<<40;
if(buf[0]==0xFF)
a=buf[6]|buf[5]<<8|buf[4]<<16|buf[3]<<24|buf[2]<<32|buf[1]<<40;
и как мне может в данном случае помочь приведение типов?
62K
27 марта 2013 года
LWhisper
33 / / 27.11.2012
Цитата: AVDEY
Цитата:
"Толи я тупой то ли лыжи не едут".


Мне надо записать в переменную _int64 байти со сдвигом. Поскольку последовательность может быть от младшего к старшему и от старшего к младшему байт.
ну например:

 
Код:
uchar buf[10];
ulong dw;
__int 64 a;
      ReadFile(hPort,&buf,10,&dw,NULL);

if(buf[0]==0xAA)
a=buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24|buf[5]<<32|buf[6]<<40;
if(buf[0]==0xFF)
a=buf[6]|buf[5]<<8|buf[4]<<16|buf[3]<<24|buf[2]<<32|buf[1]<<40;
и как мне может в данном случае помочь приведение типов?


Я не очень хорошо разбираюсь в Сях, но, как мне помнится, строка формата там должна быть printf("%I64d", value); или printf("%lld",value);
Ты глянь в дебаге что у тебя в этом числе. Как мне кажется, пробелма именно с выводом.

260
27 марта 2013 года
Ramon
1.1K / / 16.08.2003
Цитата:
"Толи я тупой то ли лыжи не едут".


Не тронь Будду.

 
Код:
a=buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24|(uint64_t)buf[5]<<32|(uint64_t)buf[6]<<40;
PS: Завязывайте с этим и найдите себя в ином месте.
538
28 марта 2013 года
AVDEY
188 / / 17.11.2005
Действительно я ступил, не додумался побайтно привести тип uchar к uint64.
Меня наверное сбило с толку что при программировании 8-битных микропроцессоров 16-битние переменные не требуют приведения типов.
Так все работает. Компилятор не ругается. Число выводится.
Всем огромное спасибо.

PS: Век живы, век учись.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог