C++, Byte i Bits
15 отговора
640 прегледа
C++, Byte i Bits
Напоследък клубът заприлича на детцка забавачка,
разни майтапи се обсъждат разни забивки на Вин'98.
Няма нито една сериозна тема.
А аз се мъча с едно просто нещо :
Как да взема от един char масив 3,4,5 байт и да ги вкарам в едно int,
пета компилация правя и все бъркам.
Накрая ще взема да си отворя Строуструп .....
Лошо нещо е пролетната умора ...
разни майтапи се обсъждат разни забивки на Вин'98.
Няма нито една сериозна тема.
А аз се мъча с едно просто нещо :
Как да взема от един char масив 3,4,5 байт и да ги вкарам в едно int,
пета компилация правя и все бъркам.
Накрая ще взема да си отворя Строуструп .....
Лошо нещо е пролетната умора ...
Re: C++, Byte i Bits
char *s;
blah blah................
int i = (*((int*) (s+2)) & 0x00ffffff);
tova shte ti varshi rabota ako 3 bait e mladshia a 5 e starshia, kakto e pri intelskite procesori
Пламен
blah blah................
int i = (*((int*) (s+2)) & 0x00ffffff);
tova shte ti varshi rabota ako 3 bait e mladshia a 5 e starshia, kakto e pri intelskite procesori
Пламен
Редактирано от Плaмeн на
Re: C++, Byte i Bits
wow tova sus sigurnosht shte dade exception na Risc, PowerPC ili Alpha mashini :)
po dobre napravi taka - da ne govorim puk LITTLE ENDIAN BIG ENDIAN problemite
pjuu - dosta golemo izleze - e imash warniat i da izpolzwash prednata versia de :)

Um tzaruwa, Um robuwa, Um belia delfin
po dobre napravi taka - da ne govorim puk LITTLE ENDIAN BIG ENDIAN problemite
unsigned getInteger24( void *p, int numBytes, int isBigEndian )
{
int i;
unsigned num;
for( num=0, i=0; i < numBytes; i++ )
{
num <<= 8;
num |= ((unsigned char *)p) [ isBigEndian ? i : numBytes - i - 1 ];
}
}
pjuu - dosta golemo izleze - e imash warniat i da izpolzwash prednata versia de :)
Um tzaruwa, Um robuwa, Um belia delfin
Re: C++, Byte i Bits
аз пък що си мислех, че powerpc и alpha са risc
за обратен byte order, просто заменяш двойката с единица
.
a пък каква красота ще стане ако като викам функцията подам за numBytes например 18
.
Пламен
за обратен byte order, просто заменяш двойката с единица
a пък каква красота ще стане ако като викам функцията подам за numBytes например 18
Пламен
Редактирано от Плaмeн на
Re: C++, Byte i Bits
#pragma pack( push, 1 )
struct int_struct {
char b1;
char b2;
char b3;
char b4;
} int_bytes;
#pragma pack( pop)
/*
samo triabwa da podredish b1 - b4 w zawisimost ot
towa kak e int pri tebe - ako iskash da e prenosimo
shte triabwa da se prawiat niakoi gadni trikowe :)
koito niama da obsyjdam tuka :)
*/
int_bytes.b1 = ch[i1];//i1 - i3 sa w zawisimost ot towa kak tochno iskash
int_bytes.b2 = ch[i2];//da wleznat baitowete :)
int_bytes.b3 = ch[i3];
int_bytes.b4 = 0;
i = *(int*)(&int_bytes);
ili
union int_union {
int i;
struct int_struct is;
} iu;
togawa prosto:
iu.int_bytes.b1 = ch[i1];//i1 - i3 sa w zawisimost ot towa kak tochno iskash
iu.int_bytes.b2 = ch[i2];//da wleznat baitowete :)
iu.int_bytes.b3 = ch[i3];
iu.int_bytes.b4 = 0;
i = iu.i;

struct int_struct {
char b1;
char b2;
char b3;
char b4;
} int_bytes;
#pragma pack( pop)
/*
samo triabwa da podredish b1 - b4 w zawisimost ot
towa kak e int pri tebe - ako iskash da e prenosimo
shte triabwa da se prawiat niakoi gadni trikowe :)
koito niama da obsyjdam tuka :)
*/
int_bytes.b1 = ch[i1];//i1 - i3 sa w zawisimost ot towa kak tochno iskash
int_bytes.b2 = ch[i2];//da wleznat baitowete :)
int_bytes.b3 = ch[i3];
int_bytes.b4 = 0;
i = *(int*)(&int_bytes);
ili
union int_union {
int i;
struct int_struct is;
} iu;
togawa prosto:
iu.int_bytes.b1 = ch[i1];//i1 - i3 sa w zawisimost ot towa kak tochno iskash
iu.int_bytes.b2 = ch[i2];//da wleznat baitowete :)
iu.int_bytes.b3 = ch[i3];
iu.int_bytes.b4 = 0;
i = iu.i;
Re: C++, Byte i Bits
Може и така:
char s[..];
unsigned char *p = (unsigned char*)s;
int x = ((int)p[4]<<16) | ((int)p[3] << 8) | p[2];
Е, само ако sizeof(int) = 4
char s[..];
unsigned char *p = (unsigned char*)s;
int x = ((int)p[4]<<16) | ((int)p[3] << 8) | p[2];
Е, само ако sizeof(int) = 4
Re: C++, Byte i Bits
baaa she davam zaeto :) ako mi podadesh 18...
Um tzaruwa, Um robuwa, Um belia delfin
Um tzaruwa, Um robuwa, Um belia delfin
Re: C++, Byte i Bits
amche az za Risc imah predvid - takova de - familiata - inache werno sa si risc, ama nali se wodjat s drugi imena... ahaum
Um tzaruwa, Um robuwa, Um belia delfin
Um tzaruwa, Um robuwa, Um belia delfin
Re: C++, Byte i Bits
това, че риск процесорите гърмят ако int-овете им не са подравнени не го знаех, но нещо не ми се вижда много разумно.
какво ще стане ако подравниш на 1 байт една такава структура:
struct {char a; int b;}?
а това понякога може да се налага.
Пламен
какво ще стане ако подравниш на 1 байт една такава структура:
struct {char a; int b;}?
а това понякога може да се налага.
Пламен
Re: C++, Byte i Bits
compilatora se seshta i popylva prazninata taka che int da e na cheten (ili deliasht se na chetiri -- zavisi ot arch) address. dori za intel mislia che shte go podravni -- po byrz e dostypa taka
Re: C++, Byte i Bits
става дума когато програмиста ИЗРИЧНО каже, че иска подравняване на един байт, налага се понякога,
иначе VC по подразбиране подравнява на 8 байта, но това е отделна тема
Пламен
иначе VC по подразбиране подравнява на 8 байта, но това е отделна тема
Пламен
Re: C++, Byte i Bits
ami procesora IZRICHNO shte dade exception. Njakoi PowerPC-ta maj imat njakakwa poddryzhka primerno w BIOS-a ili kakto tam se naricha deto go prihwashta toja exception, prawi dwa aligned memory read-a i sglobjawa dannite koito si poiskal misaligned. w rezultat na towa a) programata raboti b) 100 pyti po-bawno, i to bez da razberesh zashto.
x86-icite ne gyrmjat, no i pri tjah pri misaligned access mozhe da postrada proizwoditelnostta (ako nastypish dwa cache lines) - taka che po princip da spazwash natural alignment-a (wsjako neshto da e aligned na adres kraten na razmera my) e dobra ideja.
x86-icite ne gyrmjat, no i pri tjah pri misaligned access mozhe da postrada proizwoditelnostta (ako nastypish dwa cache lines) - taka che po princip da spazwash natural alignment-a (wsjako neshto da e aligned na adres kraten na razmera my) e dobra ideja.
Re: C++, Byte i Bits
виж сега, аз това го знам,
въпросът е че ПОНЯКОГА се налага структурата която получаваш да е плътно опакована,
например получаваш по сокет двоични данни от някаква хардуерна щуротия и тоя който я е правил е решил че трябва всичко да е плътно (бил е прав всъщност щото от де да знае кой ще ги чете и на колко ще му е удобно да подравнява).
та в тоя случай най-естествено и чисто е да се използва структура без подравняване.
Пламен
въпросът е че ПОНЯКОГА се налага структурата която получаваш да е плътно опакована,
например получаваш по сокет двоични данни от някаква хардуерна щуротия и тоя който я е правил е решил че трябва всичко да е плътно (бил е прав всъщност щото от де да знае кой ще ги чете и на колко ще му е удобно да подравнява).
та в тоя случай най-естествено и чисто е да се използва структура без подравняване.
Пламен
Re: C++, Byte i Bits
Abe ne vinagi gurmi pod NT mojes da
SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT) i NT-to se opravia.
Pri Intel ima flag koito kato e 0 procesora ti pravi automatic fix up inache INT 17H
SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT) i NT-to se opravia.
Pri Intel ima flag koito kato e 0 procesora ti pravi automatic fix up inache INT 17H
Re: C++, Byte i Bits
S Microsoft's C/C++ slagash __unaligned na ukazatelia prez koito accessvash dannite
Re: C++, Byte i Bits
Ami w takyw sluchaj wmesto da se nadlygwash s kompilatora s razni #pragma pack i da swap-wash za da dokarash to twoja endianness, po-chisto e da chetesh bajt po bajt i da sglobjawash. ili da rabotish prez njakakyw stream interface, kojto kato chetesh
stream.read(&myByte);
stream.read(&myLong);
i prez um njama da mu mine da te precaka s podrawnjawane.
fread(&myStructure, sizeof(MyStructure)) e evil.
stream.read(&myByte);
stream.read(&myLong);
i prez um njama da mu mine da te precaka s podrawnjawane.
fread(&myStructure, sizeof(MyStructure)) e evil.