2012-04-10 7 views
2

Ich bin mit einem einfachen Problem fest. Hier ist der Code:Packen zwei 8-Bit-Werte

int main(int argc, char **argv) 
{ 
    char buf[2] = {0xd, 0x1f}; 
    unsigned int a; 

    a = ((buf[1] << 8) & 0xFF00) | buf[0]; 
    printf("%d\n",a); 

    return 0; 
} 

Der Wert in a, die ich brauche, ist 0x1FD(509) aber wenn ich das obige Programm lief der Ausgang in a ist 0x1F0D(7949).

Wie kann ich das erreichen?

EDIT: Ok lass mich klären. Ich mache ein Projekt, wo ich die Daten, wie im Code-Ausschnitt gezeigt, erhalte. Zur Vereinfachung habe ich sie als lokal deklariert. Hauptsache ich möchte, dass die Daten als 0x1FD(509) interpretiert werden.

+1

Ich finde es nicht klar, was Sie genau machen wollen. Btw @AdamLiss, ich kenne die Shift-and-or-Methode, aber ich glaube nicht, dass es klar ist, was Leo zu tun versucht. Wenn Sie 509 brauchen, warum schreiben Sie 0xd, 0x1f? Warum nicht stattdessen einen ganzzahligen Wert oder ein Array verwenden? Welches Problem versucht dieser Code zu lösen? –

+0

Leo, ist @dasblinkenlight auf dem richtigen Weg? –

+0

wollen Sie nur die Hex-Werte packen (ignorieren Sie Nullen)? –

Antwort

3

Sie benötigen

char buf[2] = {0xfd, 0x01}; 

Das heißt, Sie müssen die Bits von rechts nach "Pack" nach links.

Dies ist deutlicher, wenn man Polster den gewünschten Wert mit Nullen, so dass es als eine Folge von vollständigem Bytes geschrieben:

0x1FD = 0x01FD = (0x01 << 8) | 0xFD

+0

Der OP möchte seine Eingabe nicht ändern, er möchte eine andere Ausgabe bekommen. –

+1

@Richard: Das wissen wir nicht wirklich, oder? – JeremyP

+1

@ RichardJ.RossIII: Ich nehme diese Wette. Ich habe von zu vielen Jahren gelernt, für den technischen Support zu füllen, dass Sie manchmal den Entwickler debuggen müssen, bevor Sie den Code debuggen können. :-) –

2

A char 8 Bits, daher wird es, dargestellt durch zwei hexadezimale Ziffern.

Wenn Sie 0x1FD in Ihrer Variablen a möchten, dann sollten Sie das Array mit 0xfd und 0x01 initialisieren.

-1

Sie müssen die leeren Bits entfernen:

unsigned pack(char bytes[2]) 
{ 
    char shift = 8; 
    if (bytes[0] < 32) 
     shift = 4; 

    return (unsigned) ((bytes[1] << shift) | bytes[0]); 
} 
+0

Warum die down vote? es tut genau das, was das OP wollte –

+0

Sie sollten mit 32 vergleichen, nicht 128. Aber vor allem ist es völlig irreführend in Bezug auf die OP-Frage. –

+0

@DidierTrosset Sie sind richtig, ich hätte im Vergleich zu 32. Allerdings erklärte der OP, dass was er wollte, war es zu packen, so dass es das Ergebnis, das er wollte, nicht die Eingabe zu ändern, um die Ausgabe wollte er erhalten. Dies passt sich beiden Situationen sehr gut an. –

6

Das Programm tut, was Sie es zu tun gefragt. Die Quelle Ihrer Verwirrung ist in der 0xd Konstante, die eigentlich 0x0d ist, weil char acht Bits ist. Packen Sie es zusammen mit 0x1f, wie Sie sollten 0x1f0d produzieren, und es tut.

+0

Ah, Sie haben die Verwirrung gefunden. Vielen Dank. –

+0

@dasblinkenlight: Das ist, was ich versucht habe vorausgesetzt, dass es funktioniert.Ich möchte die Ausgabe 0x1FD –

+0

@LeoMessi Was möchten Sie mit den oberen vier Bits von '0x0D' dann tun? Zum Beispiel, wenn 'buf [2] = {0xad, 0x1f}', was ist Ihre erwartete Ausgabe? – dasblinkenlight