Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

1

01.07.2008, 10:29

char * in short konvertieren

Hallo,

ich bin grad mit folgendem Problem konfrontiert. Ich möchte Pixelwerte aus einem Graustufenbild auslesen. Die einzelnen Werte bekomme ich in einem char- array. Um mit diesen Werten rechnen zu können, muss ich sie konvertieren in einen int, short... Bei 16bit Graustufen klappt alles super. Leider bekomme ich auch 13bit oder 12bit graustufenbilder. Ich weiß wo das HighBit liegt, aber mir will einfach nicht einfallen, wie ich diese Werte konvertieren kann. Da die Pixeldaten in einem char-Array liegen, werden diese immer als 16bit interpretiert und daher falsch konvertiert. Bisher mache ich es durch casting:

C-/C++-Quelltext

1
 short grauwert = (short)grauwertarray;


Kann mir jemand weiterhelfen?

Danke im Voraus
Andi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

01.07.2008, 10:40

Du musst die Bits, die du nicht haben willst, durch eine Bitmaske entfernen, indem du sie mit dem &-Operator mit den Daten verknüpfst, und dann an die richtige Stelle shiften (mit >>).

Beispiel:
Deine Daten sind (16 Bits):
1001100111100101

Du möchtest jetzt nur die Bits Nr. 4, 5, 6, 7, 8 (von links gezählt) haben und die als eine "normale" Zahl interpretieren.

Dann ist das die Bitmaske:
0001111100000000

Mit & mit den Daten verknüpft erhältst du:
0001100100000000

Und jetzt musst du die Bits noch um 8 Stellen nach rechts verschieben (mit >> 8):
0000000000011001

Nun hast du deinen Wert, in diesem Fall 25.

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

3

01.07.2008, 11:02

Vielen Dank für die schnelle Antwort. Aber es hilft mir leider noch nicht. Das Problem ist, dass die Werte Vorzeichenbehaftet sind. Ein Beispiel:

Meine Daten 16bit: 11111000 00000000
ist umgerechnet -2048 (klappt)

andere Daten 13bit: 00011100 00000000
ist umgerechnet 7168 sollte aber -1024 (glaub ich) sein, klappt nicht.


ich probier mal noch ein wenig

Viele Grüße
Andi

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

01.07.2008, 11:40

Und wieso glaubst du das es dieser Wert sein müsste? Zur Not oderst du halt mit 0xe000.
@D13_Dreinig

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

5

01.07.2008, 11:59

die Uni ist schon eine Weile her und ich bin nich mehr ganz so fit in dem Binärsystem.

ich hab die Min. bzw. Maxima der Grauwerte.Hab eine so eine Bilbearbeitungsbibliothek eingebunden, die mir das verrät. Da fast das ganze Bild schwarz ist, also der min Wert, konnte ich beim Pixel auslesen diesen Wert gut zuordnen. Leider krieg ich die Pixeldaten nur in Form von einem char-array raus, weshalb ich jetzt etwas fest stecke. Bei 16bit Graustufen klappt ja alles, daher muss es an der umrechnung liegen.
Ich versuch es mal mit strtol. Es muss doch irgendwie gehen, dass man 13bit char in vorzeichenbehaftete Zahlen umwandeln kann.

Gruß Andi

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

01.07.2008, 12:09

Sowas?

C-/C++-Quelltext

1
2
3
char c[] = { 28, 0 };
short value = 0xe000;
value |= ( c[ 0 ] & 0x1f ) << 8 | c[ 1 ];
@D13_Dreinig

Andi

Frischling

  • »Andi« ist der Autor dieses Themas

Beiträge: 37

Beruf: Student

  • Private Nachricht senden

7

01.07.2008, 12:29

jupp, perfekt. So funktioniert das also. Du hast mir grad den Tag gerettet.

Vielen dank und liebe Grüße
Andi

Werbeanzeige