Forum: PC-Programmierung LEB128 in C#


von Manfred Lunert (Gast)


Lesenswert?

Hallo

Ich habe ein Problem mit Little Endian Base 128 ( LEB128)
Ich habe ein ByteArray von dem ich weis das es immer mit einem unsigned 
LEB128 encoded Integer beginnt.

Wie kann ich in C# die Zahl im LEB128 decodieren bzw mir anzeigen 
lassen.
Ich in einem Forum folgenden Code gefunden allerdings benutzt dieser den 
BinaryReader ich habe alledings ein ByteArray und kein File

1
uint GetSmallUnsigned(BinaryReader reader) {
2
  int offset = 0;
3
  uint val = 0;
4
  while (true) {
5
    byte c = reader.ReadByte();
6
    // transfer 7 bits per byte
7
    val |= (uint)(c & 0x7f) << offset;
8
    // check terminator
9
    if ((c & 0x80) == 0) break;
10
    offset += 7;
11
  }
12
  return val;
13
}

von Peter II (Gast)


Lesenswert?

Manfred Lunert schrieb:
> Ich in einem Forum folgenden Code gefunden allerdings benutzt dieser den
> BinaryReader ich habe alledings ein ByteArray und kein File

wo ist denn das das Problem? Versteht du den Code überhaupt?

Es ist überhaupt kein Problem, ihn so zu ändern das er mit einem Array 
zurecht kommt.
Nur code aus dem Netz kopieren ist halt noch lange kein Programiren.

von Manfred Lunert (Gast)


Lesenswert?

Hallo Peter

Ich denke deine Kritik ist absolut gerechtfertigt !.
Ich lerne lieber indem ich mir ein Project suche und mir durchbeiße das 
ist nicht ganz so trocken. Aber ich bin noch weit davon entfernt das 
Programmieren zu nennen.

Aber jeder lernt eben wie er es gerne macht.


Zum Thema.

Könnte ich einfach mir einen For-Schleife durch das Array laufen ähnlich 
wie der BinaryReader es macht im Beispiel. Wenn ich es richtig verstehe 
schnappt der sich bei jedem Durchlauf das nächste Byte.

Das könnte ich ja auch machen indem ich einfach Byte[i] und dann bei 
jedem Durchlauf i um +1 erhöhe.Oder liege ich so weit daneben das ich 
lieber hoffen sollte das jemand einen Code postet

von Peter II (Gast)


Lesenswert?

Manfred Lunert schrieb:
> Das könnte ich ja auch machen indem ich einfach Byte[i] und dann bei
> jedem Durchlauf i um +1 erhöhe.
schon mal sehr gute Idee. Als alternative kann man auch ein foreach 
verwenden-

> Oder liege ich so weit daneben das ich
> lieber hoffen sollte das jemand einen Code postet
versucht es doch einfach, wenn es nicht klappt poste dein Versuch.

von Manfred Lunert (Gast)


Lesenswert?

Danke , ich werde es einfach mal ausprobieren.


Verstehe ich es richtig das der Code hier checkt ob das höchste Bit 
gleich 0 ist und unterbricht dann die Funktion ?
Ich frage weil ich mich wunder woher ich weis wie viele Bytes das LEB128 
tatsächlich in Anspruch nimmt im Byte Array.
1
 if ((c & 0x80) == 0) break;

von Peter II (Gast)


Lesenswert?

Manfred Lunert schrieb:
> Verstehe ich es richtig das der Code hier checkt ob das höchste Bit
> gleich 0 ist und unterbricht dann die Funktion ?

richtig erkannt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.