/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
make16 og make32
Fra : John T.


Dato : 08-09-03 16:12

Har set nogle funktioner der hedder make16 og make 32 der sådan set bare
tager og konkadenerer to eller fire bytes til én short eller long, f.eks.:

unsigned char test[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0,9,0xA);
unsigned short test2=0;
unsigned long test3=0;

test2 = make16(test[3],test[5]);
test3 = make32(test[0],test[1],test[2],test[3]);

Hermed test2 = 0x46 og test3 = 0x1234

Hvad skal jeg inkludere får at kunne gøre brug af disse funktioner??? Eller
har nogen koden til dem liggende som jeg blot kan copy-paste???

John




 
 
Bertel Brander (09-09-2003)
Kommentar
Fra : Bertel Brander


Dato : 09-09-03 00:26

John T. wrote:
> Har set nogle funktioner der hedder make16 og make 32 der sådan set bare
> tager og konkadenerer to eller fire bytes til én short eller long, f.eks.:
>
> unsigned char test[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0,9,0xA);
> unsigned short test2=0;
> unsigned long test3=0;
>
> test2 = make16(test[3],test[5]);
> test3 = make32(test[0],test[1],test[2],test[3]);
>
> Hermed test2 = 0x46 og test3 = 0x1234
>
> Hvad skal jeg inkludere får at kunne gøre brug af disse funktioner??? Eller
> har nogen koden til dem liggende som jeg blot kan copy-paste???
>
Der er ikke nogen standard funktioner der hedder make16 eller make32.

Er du sikker på at du ikke vil have make16(0x12, 0x34) til at give
0x1234 og make32(0xDE, 0xAD, 0xBE, 0xEF) til at give 0xDEADBEEF ?
Hvis der er det du vil have dem til, kunne man jo lave dem som
makroer:
#define make16(a_, b_) (a_ << 8 | b_)
#define make32(a_, b_, c_, d_) (a_ << 24 | b_ << 16 | c << 8 | d_)

Hvis du vil have dem til at virke som du beskrev, skal du skifte med
4 (og 8 og 12).

De mere pedantisk anlagte vil sige at en char ikke altid er 8 bit,
en short ikke altid 16 bit og en long ikke behøver at være 32 bit.
Ovenstående går dog ud fra at det er tilfældet.

/b


Anders J. Munch (09-09-2003)
Kommentar
Fra : Anders J. Munch


Dato : 09-09-03 08:52

"Bertel Brander" <bertel@post4.tele.dk> wrote:
> Er du sikker på at du ikke vil have make16(0x12, 0x34) til at give
> 0x1234 og make32(0xDE, 0xAD, 0xBE, 0xEF) til at give 0xDEADBEEF ?
> Hvis der er det du vil have dem til, kunne man jo lave dem som
> makroer:
> #define make16(a_, b_) (a_ << 8 | b_)
> #define make32(a_, b_, c_, d_) (a_ << 24 | b_ << 16 | c << 8 | d_)

Farligt, der mangler parenteser omkring makroargumenterne. Skriv det
da som almindelige funktioner og undgå den slags problemer:

inline unsigned short make16(unsigned char a, unsigned char b)
{
return a << 8 | b;
}

En bug i make32 makroen: (a_ << 24) er af typen int, men resultatet
kan ikke nødvendigvis være i en int.

typedef unsigned long ulong;
typedef unsigned char uchar;
inline ulong make32(uchar a, uchar b, uchar c, uchar d)
{
return (ulong)a << 24 | (ulong)b<<16 | (ulong)c<<8 | d;
}

mvh. Anders



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste