побайтная запись __int64
У меня с устройства считываться данные блоками по 51-байт, с них 6-байт беззнаковое целое.
Надо этих 6-байт их запихнуть в переменную __int64.
Пробую так:
Код:
unsigned __int64 f=0x44|0x79<<8|0xf8<<16|0x34<<24|0xff<<32|0xab<<40;
Последние 2 байта отбрасываются.
Вывожу:
Код:
MVSC
printf("a=%164d\n",f); или
printf("a=%X\n",f);
Qt
qDebug()<<f;
qDebug()<<qDebug()<<QString::number(a,16);
printf("a=%164d\n",f); или
printf("a=%X\n",f);
Qt
qDebug()<<f;
qDebug()<<qDebug()<<QString::number(a,16);
RTFM printf, stdint.h
unsigned __int64 a=0xffffffffffffffffULL;
unsigned __int64 a=UINT64_C(18446744073709551615);
у меня єсть масив uchar 6байт и его надо записать в unsigned __unt64;
В таком случае откройте для себя приведение типов.
Мне надо записать в переменную _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;
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;
Цитата: 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;
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);
Ты глянь в дебаге что у тебя в этом числе. Как мне кажется, пробелма именно с выводом.
Не тронь Будду.
Код:
a=buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24|(uint64_t)buf[5]<<32|(uint64_t)buf[6]<<40;
Меня наверное сбило с толку что при программировании 8-битных микропроцессоров 16-битние переменные не требуют приведения типов.
Так все работает. Компилятор не ругается. Число выводится.
Всем огромное спасибо.
PS: Век живы, век учись.