Konvertiere ein Array von Bytes in eine Dezimalzahl als String

8

Ich versuche eine Funktion zu schreiben, die ein beliebiges großes Array von Bytes (größer als 64 Bit) in eine Dezimalzahl konvertiert, die als String in c # dargestellt wird, und ich kann einfach nicht herausfinden, wie es geht.

Zum Beispiel der folgende Code ...

%Vor%

.. sollte ausgedruckt werden

%Vor%

Ich möchte dafür nicht einfach eine extra Bibliothek wie biginteger verwenden, weil ich möchte, dass sie einfach ist und sie gerne versteht wie es funktioniert.

    
Martin 11.03.2010, 09:43
quelle

4 Antworten

2

Basierend auf @ Wilheims Antwort:

%Vor%     
Simon Buchan 12.03.2010, 03:10
quelle
5

Einige Richtlinien:

  1. Sie müssen die Ziffern der Zahl in einer Matrix speichern, ein Leerzeichen für jede Ziffer. Die Matrix beginnt leer.
  2. Dann brauchen Sie eine Matrix, um die Multiplikation der Matrix zu speichern. Es beginnt auch leer.
  3. Jetzt für jedes Byte, das Sie haben:
    1. Zuerst multiplizieren Sie jede Ziffer der aktuellen Zahlenmatrix mit 256, speichern Sie den 10-Modul in der entsprechenden temporären Ziffer und addieren Sie die Zahl geteilt durch 10 zur Multiplikation der nächsten Ziffern.
    2. Weisen Sie die temporäre Multiplikationsmatrix der aktuellen Ziffernmatrix zu.
    3. Fügen Sie dann das Byte zur ersten Ziffer hinzu.
    4. Korrigiere die aktuelle Matrix, indem du nur den 10-Modul in jedem Index speicherst und den Wert geteilt durch 10 zum nächsten Index überträgst.
  4. Dann müssen Sie jede Ziffer in einer Zeichenkette verketten.
  5. Gib die Zeichenfolge zurück.

Vergessen Sie nicht, jede Matrix nach Bedarf zu erweitern, oder bestimmen Sie anhand der Anzahl der übergebenen Bytes die maximal erforderliche Größe.

Bearbeiten, Beispiel nach dem dritten Schritt oben:

Werte = [0xAA, 0xBB] Anfangsstrom = [] Anfangstemp = []

Mit 0xAA

  1. Nichts zu vermehren.
  2. Keine Änderung bei der Zuweisung.
  3. Wir fügen 0xAA zum ersten Wert in current hinzu: Current = [170]
  4. Wir korrigieren den aktuellen Wert, um nur das Modul zu speichern und übergeben den Wert geteilt durch zehn an den nächsten Wert:
    1. 1. Stelle: Current = [0] pass 17.
    2. 2. Ziffer: Current = [0, 7] pass 1.
    3. 3. Stelle: Current = [0, 7, 1] kein Wert zu übergeben, damit der Prozess endet.

Jetzt mit 0xBB

  1. Multipli mit 256, speichern in Temp und korrigieren, tun für jede Ziffer:
    1. 1. Stelle: Temp = [0], 0 zum Speichern der nächsten Ziffer.
    2. 2. Stelle: Temp = [0, 1792] vor der Korrektur, Temp = [0, 2], 179 nach der Korrektur.
    3. 3. Stelle: Temp = [0, 2, 1 * 256 + 179 = 435] vor der Korrektur, Temp = [0, 2, 5], 43 nach der Korrektur.
    4. 4. Stelle: Temp = [0, 2, 5, 43] vor, Temp = [0, 2, 5, 3], 3 nach
    5. 5. Stelle: Temp = [0, 2, 5, 3, 4] vor und nach der Korrektur, keine Ziffer zum Speichern, damit endet die Multiplikation.
  2. Assing temp to current: Aktuell = [0, 2, 5, 3, 4]; Temp = []
  3. Fügen Sie der ersten Ziffer den aktuellen Wert hinzu: Current = [187, 2, 5, 3, 4]
  4. Korrigiere die Werte:
    1. 1. Stelle: Aktuell = [7, 2, 5, 3, 4], 18 zu übergeben.
    2. 2. Stelle: Current = [7, 0, 5, 3, 4], 2 zu übergeben.
    3. 3. Stelle: Current = [7, 0, 7, 3, 4], nichts zu passieren, damit die Addition endet.

Jetzt müssen wir nur noch für das Ergebnis 43707 verketten.

    
Wilhelm 11.03.2010 10:55
quelle
1

Sie wollen die Funktionsweise verstehen, also schauen Sie sich super cool an C # BigInteger Class @ CodeProject .

Außerdem habe ich diese Klasse für diese Frage auf das Nötigste reduziert. Es kann weiter optimiert werden. :)

Versuchen Sie, den folgenden Code zu kopieren und einzufügen, es funktioniert !!

%Vor%     
Pratik Deoghare 11.03.2010 12:09
quelle
0

Würde System.Decimal Ihre Anforderungen erfüllen?

    
Paul Ruane 11.03.2010 10:21
quelle

Tags und Links