C++, Byte i Bits

15 отговора 640 прегледа
#1

C++, Byte i Bits

Напоследък клубът заприлича на детцка забавачка,
разни майтапи се обсъждат разни забивки на Вин'98.
Няма нито една сериозна тема.
А аз се мъча с едно просто нещо :

Как да взема от един char масив 3,4,5 байт и да ги вкарам в едно int,
пета компилация правя и все бъркам.
Накрая ще взема да си отворя Строуструп .....
Лошо нещо е пролетната умора ...

Отговор
в отговор на LamerSlamer #2

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

Пламен

Редактирано от Плaмeн на

Отговор
в отговор на Плaмeн #3

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


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
Отговор
в отговор на malkia #4

Re: C++, Byte i Bits

аз пък що си мислех, че powerpc и alpha са risc

за обратен byte order, просто заменяш двойката с единица .

a пък каква красота ще стане ако като викам функцията подам за numBytes например 18 .

Пламен

Редактирано от Плaмeн на

Отговор
в отговор на LamerSlamer #5

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;



Отговор
в отговор на LamerSlamer #6

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

Отговор
в отговор на Плaмeн #7

Re: C++, Byte i Bits

baaa she davam zaeto :) ako mi podadesh 18...

Um tzaruwa, Um robuwa, Um belia delfin
Отговор
в отговор на Плaмeн #8

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
Отговор
в отговор на malkia #9

Re: C++, Byte i Bits

това, че риск процесорите гърмят ако int-овете им не са подравнени не го знаех, но нещо не ми се вижда много разумно.
какво ще стане ако подравниш на 1 байт една такава структура:
struct {char a; int b;}?
а това понякога може да се налага.

Пламен
Отговор
в отговор на Плaмeн #10

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

Отговор
в отговор на l #11

Re: C++, Byte i Bits

става дума когато програмиста ИЗРИЧНО каже, че иска подравняване на един байт, налага се понякога,
иначе VC по подразбиране подравнява на 8 байта, но това е отделна тема

Пламен
Отговор
в отговор на Плaмeн #12

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.

Отговор
в отговор на Skotowydec #13

Re: C++, Byte i Bits

виж сега, аз това го знам,
въпросът е че ПОНЯКОГА се налага структурата която получаваш да е плътно опакована,
например получаваш по сокет двоични данни от някаква хардуерна щуротия и тоя който я е правил е решил че трябва всичко да е плътно (бил е прав всъщност щото от де да знае кой ще ги чете и на колко ще му е удобно да подравнява).
та в тоя случай най-естествено и чисто е да се използва структура без подравняване.

Пламен
Отговор
в отговор на Плaмeн #14

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

Отговор
в отговор на Плaмeн #15

Re: C++, Byte i Bits

S Microsoft's C/C++ slagash __unaligned na ukazatelia prez koito accessvash dannite

Отговор
в отговор на Плaмeн #16

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.

Отговор