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

1

04.02.2011, 21:43

Kleine Frage zu bytes

Hallöle,

hab ne Frage zum konvertieren von Bytes. Da ich bei Rechnungen mit Bytes total Anfänger bin hoffe ich trotzdem dass ihr mich versteht ^^

Also ich fange ein Datenpaket ab und ein Byte in Hexdezimalschreibweise -3f. Jetzt möchte ich es so konvertieren das C1 rauskommt. -3f wären ja 0xFFFFFFC1, aber wenn ich 0xFFFFFFC1-0xFFFFFF00 rechne kommt trotzdem 0xFFFFFFC1 raus und nicht 0x000000C1 also 0xC1.

Hier mal mein Programmteil :

Quellcode

1
2
3
4
if(data[count]<0)
            {
                data[count] -= 0xFFFFFF00;
            }


In dem Array data an position count steht die Zahl -3f

Kann mir da wer helfen :huh:

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

04.02.2011, 22:51

Kann es sein das data[count] nur 1 Byte groß ist (vom Typ char), und die 0xFFFFFFC1 rauskommen weil du dann irgendwo (z.B. der Ausgabe) auf ein 32 Bit Typ (int) castest?

3

04.02.2011, 22:52

Hi,

ich hoffe ich hab dich richtig verstanden. Um die letzten 2 Bytes zu bekommen kannst du einfach den Binären Und Operator benutzten

C-/C++-Quelltext

1
data[count] = data[count] & 0x000000FF;

4

04.02.2011, 23:21

Abend,

@Tobiking: Wenn ich mir das Bytearray im debugger anschaue sehe ich Werte von -254 bis +254 (oder -255 bis +255 oder so halt, 1 byte groß). Wenn ich also -31 habe müsste ich +254 rechnen damit das gewünschte Datenbyte entsteht, nur weiß ich nicht wie das mit den byteoperanten klappt =/

Denn sowas klappt nicht :

Quellcode

1
2
3
4
if(data[count]<0)
            {
                data[count] +=254;
            }


Ich müsste

Quellcode

1
2
3
4
5
6
if(data[count]<0)
            {
                int i = data[count];
                i += 254;
                data[count] =  XXX
            }


machen. Also wenn zB zuerst -64 wäre, dann das +254 wären 190, diese 190 müsste ich in data[count] schreiben, nur wie kann man das so konvertieren =/

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

04.02.2011, 23:27

Wenn ich dich richtig verstehe willst du einfach an den Wert des letzten Byte eines 4 Byte integer rankommen!?
Das geht genau wie EdelStoff gesagt hat:

C-/C++-Quelltext

1
2
  unsigned int whatever = 0xFFFFFFC1;
  char my_byte = whatever & 0x000000FF;  // my_byte hat danach den Wert 0xC1

Der Trick mit der bitweisen UND Verknüpfung ist ganz einfach wenn du dir das mal binär aufschreibst:

Quellcode

1
2
3
4
 11111111 11111111 11111111 11000001 &
 00000000 00000000 00000000 11111111
--------------------------------------
 00000000 00000000 00000000 11000001

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

05.02.2011, 09:54

Abend,

@Tobiking: Wenn ich mir das Bytearray im debugger anschaue sehe ich Werte von -254 bis +254 (oder -255 bis +255 oder so halt, 1 byte groß). Wenn ich also -31 habe müsste ich +254 rechnen damit das gewünschte Datenbyte entsteht, nur weiß ich nicht wie das mit den byteoperanten klappt =/

Deine Annahme ist falsch. Ein Byte kann nur Werte von -128 bis +127 fassen. Daher ist eine Rechnung von +254 natürlich falsch und ergibt bei einer Rechnung mit 8 Bit genau das gleiche wie die Zahl 2 vom bisherigen Wert abzuziehen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

05.02.2011, 11:23

Hallöle,

@Cobold stimmt du hast Recht, habe mich vertan.

Zitat

static private byte[] ChangeByte(byte[] data)
{
int count = 0;
while(count < data.length)
{
if(data[count]<0)
{
data[count] = (byte)(data[count] & 0x000000FF);
}
count++;
}
return data;
}


liefert mir bei einem Bytewert von -31 auch -31 :X

liegt das am Bytecast ?

-31 wären 0xFFFFFFCF, aber ich bräuchte nur das 0xCF, in dezimalschreibweise is CF laut windows taschenrechner 207, was mich jetzt noch mehr verwirrt weil byte ja doch nur bis 127 geht xX

ich verwechsel bestimmt jetzt zahelnsysteme :(

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

05.02.2011, 11:26

In meinem Beitrag oben steht die Lösung ja schon :rolleyes:

EDIT: Achso sry hab nicht genau genug gelesen. Was du da machst ist relativ sinnlos, überleg mal, du nimmst ein Array aus Bytes und nimmst dann von jedem Byte das letzte Byte (was natürlich immer nur das Byte selbst sein kann). Im Endeffekt ist das also nur ein sehr aufwändiges NOP ;)

-31 entspricht als Byte dem Wert 0xCF. In einen int gewandelt wird 0x000000CF draus. Das & 0x000000FF gibt wieder 0x000000CF und zurück in ein Byte gewandelt ergibt dir wieder den Wert 0xCF...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (05.02.2011, 11:45)


9

05.02.2011, 14:32

Ok ist also ziemlich Sinnfrei was ich da mache =/

Aber trotzdem kann ich mein Problem nicht lösen =(

Sagen wir mal im Byte steht -33, wenn ich das jetz in nen Int caste kommt 0xFFFFFFCD. Laut dot wären -33 ja int Int 0x000000CD was aber bei mir so nicht stimmt. wie bekomme ich nu aus 0x-33 0xCD >_<

iwie will das nicht in mein Kopf rein, sorry ._.

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

05.02.2011, 14:47

0xCD ist -0x33. Da brauchst du rein gar nichts machen, das ist nur eine Frage wie man den Wert interpretiert.

0xCD = 11001101 Binär
0xCD = 315 Oktal
0xCD = 205 Dezimal
0xCD = -0x33 als signed Byte
...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (05.02.2011, 14:52)


Werbeanzeige