Zahl gepackt (hex) darstellen.

  • geschlossen
  • Excel

  • Metaphore
  • 2831 Aufrufe 12 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zahl gepackt (hex) darstellen.

    Hallo,

    ich möchte Zahlen in eine Spalte in einer weiteren Spalte hexadezimal darstellen - und zwar komprimiert (die Datei wird später auf den Großrechner übertragen).

    Das heißt - wenn im Quellfeld bspw. "77" steht, dann muss im Zielfeld "4D" stehen - jedoch soll die "4" im ersten Halbbyte und das "D" im zweiten Halbbyte stehen (gepackt). Im Zielfeld wird dann also nur ein Zeichen angezeigt, dass nur ein Byte belegt und 1 Zeichen lang ist.

    Wie krieg ich das hin?.. Hat da jemand einen Tipp für mich?

    Übrigens: Die Analysefunktion DEZINHEX() bringt mich an dieser Stelle nicht weiter...
  • Hi!

    Könntest du ein paar Beispiele bringen, welche Ausgabe bei welcher Eingabe kommt? 77 wird in Hex umgerechnet, macht 4D, dann sollen die Bytes vertauscht werden? Macht D4? Und dann soll nur ein Zeichen davon angezeigt werden? Die 4 oder die D? Oder soll nur dann etwas angezeigt werden, wenn einer der Ziffern 0 ist? Schreib doch mal 5-10 Beispiele hin, oder versuch nochmal es mit anderen Worten zu erklären.

    Gruß

    FeliX_22

    EDIT:
    Oder gleich DEZINBIN()? :confused:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von FeliX_22 ()

  • Etwas verwirrend geschrieben, vom TS. Für mich hört sich das so an:
    A1->77
    B1->=LINKS(DEZINHEX(A1);1)
    C1->=RECHTS(DEZINHEX(A1);1)

    Das (oder Spalten B+C) kann dann als CSV oder so exportiert werden und in Spalte B steht dann das erste Halbbyte und in C das zweite. Wahrscheinlich zu einfach, aber aus eigener Erfahrung weiß ich, dass man manchmal den Baum vor lauter Bäumen nicht sieht ...
    Internette Grüße
    von der Nautilus
    cpt. Nemo
  • Sorry, dass ich nicht auf die Antworten eingegangen bin. Hab die Antworten übersehen.

    @Felix: Nööö... wie vertauschen? Es soll nichts vertauscht werden :D

    @dark: Die einzelnen Halbbytes habe ich ja im Prinzip. Aber wie speicher ich den Wert X'4D' in einer Zelle? Von mir aus auch gerne in VBA! Wenn ich X'4D' in eine Zelle schreiben würde (oder bspw. in eine Textdatei mit einem Hex-Editor), dann würde ich als Resultat ein 'M' angezeigt bekommen. Wie mache ich nun also aus der 4D ein M?

    @Nemo: Jaaa... wäre schon mal ein interessanter Ansatz. Da könnte man dann mit einem Sort auf dem Host evtl. was werden!

    Allgemein nochmal das Problem beschrieben: In Spalte A stehen Zahlen (sagen wir mal zweistellige). Wenn ich die Datei nun als Textdatei exportiere und auf den Host übertrage, dann habe ich dort eine Textdatei in der in den ersten zwei Spalten die Zahlen stehen (1. Spalte Zehner, 2. Spalte Einer). Ich möchte aber, dass die Zahlen nur in der ersten Spalte stehen - und zwar gepackt. Das heißt also - würde ich in der ersten Zeile eine 77 als Ausgangszahl haben.. dann müsste in der exportierten Textdatei das erste Zeichen in der ersten Spalte ein 'M' sein. Würde ich mir das in einem Hex-Editor anschauen, so würde ich folgendes sehen:

    M
    4
    D

    Das ist es was ich will :D

    Anders formuliert - ich möchte mit den String "4D" in einem Byte abspeichern. "4" ins erste Halbbyte und "D" ins zweite Halbbyte. Und wenn ich das irgendwann gespeichert und exportiert und auf dem Host importiert und in einem Programm eingelesen habe... dann habe ich irgendwann in einer Cobol PIC 9(02) COMP Variable meine Zahl stehen :D
  • Hi Felix,

    also die Zellen A3 und A4 betrifft hast Du mich in der Tat falsch verstanden - zur Erklärung: Schreibe in eine Datei "M" und speichere sie ab. Wenn Du diese Datei nun in einem Hex-Editor öffnest wirst Du dort kein "M" sehen, sondern "4D". Klassischerweise wird das erste Halbbyte dann in einer Zeile und das Zweite in der nächsten Zeile dargestellt, oder das Bytepaar als Päärchen.

    Mit der Funktion "Zeichen()" komme ich der Geschichte natürlich schon sehr nahe - nur leider hat die Funktion einen eigentlich anderen Zweck und kann nur Werte bis 255 verarbeiten. In meine Fragestellung habe ich zwar nur nach zweistelligen Zahlen gefragt, allerdings hilft mir natürlich nur eine Lösung, die für alle Zahlen funktioniert :)
  • Hallo Metaphore,

    lass uns doch erst einmal die korrekte Grundlage schaffen. Denn jetzt bin wahrscheinlich nicht nur ich verwirrt. Also ...
    1 Byte = 8 Bit = 2 Halbbyte
    Das Hexadezimalsystem ist ja so ausgelegt, dass mit den 2 Hälften der Darstellung genau 1/2 Byte oder eben zusammengefasste 4 Bit angezeigt werden. Darum kannst du ja auch nur 256 verschiedene Zeichen bzw. Aktionsanweisungen (z.B. bell) darstellen. - Ich denke mal, das ist dir auch klar.

    Nenne doch einmal ein Beispiel für das, was du erreichen willst, mit einem Zeichen >255. Das sind dann in der Regel 2 Byte, die ähnlich zerlegt werden können. In deinem Beispiel kannst du ja in geschweifte Klammern einen Zahlenwert für beispielsweise ein chinesisches Zeichen oder was auch immer setzen, vielleicht können wir dann mehr helfen.

    Solltest du von Unicode reden, dann hilft dir vielleicht diese Datei etwas:
    yuhu: DDL entfernt

    Da ist VBA-Code drinnen, ich denke aber, dass der so übersichtlich geschrieben worden ist, dass große Kommentare überflüssig sind.
    Internette Grüße
    von der Nautilus
    cpt. Nemo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von yuhu ()

  • Hi cpt. Nemo - also das Umwandeln einer Zahl in eine hexadezimale Zahl bzw. das Ermitteln der hexadezimalen Darstellung einer Zahl ist nicht das Problem. Auch nicht unbedingt der Zugriff auf die einzelnen Halbbytes.

    Das Problem ist Speichern in einer Zelle oder das auch das spätere Ausgaben in eine Datei.

    virgin-online.de/files/coding/hexen.html

    Die Textdatei stellt dar, was ich haben möchte wenn ich die Excel-Datei als Text-Datei speichere. Die Textdatei habe ich eben im Hex-Editor editiert - bitte schau' Dir die Datei im Hex-Editor an und wird insb. einen Blick auf die 2. Spalte. Ich denke dann wird Dir klar was ich benötige.

    Normalerweise hätte ich die Zellen per VBA ausgelesen und auf Datei geschrieben. Die Zahlen (die ich später gepackt benötige) hätte ich dann einfach binär ausgegeben. Aber leider kann man die Dateien mnit VBA wohl nur komplett binär schreiben.

    Der Clou wäre natürlich eine schöne Excel-Formel...

    Eine andere Möglichkeit wäre zu der Zahl die hexadezimale Zahl zu ermitteln, diese in Bytes aufzuteilen.. zu den einzelnen Bytes die ASCII Dartstellung ermitteln und die einzelnen ASCII (oder uni) Darstellungen konkateniert in die Zelle zurückschreiben (was natürlich über kurz oder lang zu nicht darstellbaren Zeichen führt)....

    Leider wird der Shice beim Übertragen auf den Host dann gnadenlos in EBCDIC übersetzt - und bspw. ein EBCDIC "M" (77) hat leider einen andere hexadezimale Zuordnung!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Metaphore ()

  • Moin Metaphore,

    ich drücke es mal sehr vorsichtig aus: Das ist ein sehr individuelles Problem ...
    Ich blicke da nämlich keineswegs 100% durch.
    1. Was (wo) sind die Ursprungsdaten? Wo kommt also das "M" aus Zeile 1B/1D her?
    2. Liegt die Tabelle evtl. schon in exakt der gezeigten Form vor?
    3. Ist das eigentliche Problem, dass du immer einen 4-stelligen Hex-Code brauchst?
    4. Warum ist in Zeile1 ein Leerzeichen als Trenner zwischen Sp. A und B (22. Position), bei Zeile2 nicht (in der Textdatei)?
    5. Keinerlei Trenner im erzeugten Text?

    Antwort heute wäre gut, da habe ich den Kopf noch frei uns auch etwas Zeit.

    [EDIT]Du hast Post![/EDIT]
    Internette Grüße
    von der Nautilus
    cpt. Nemo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von cpt. Nemo ()

  • Hi Nemo,

    vielen Dank für die PN. Zu Deinen Fragen nochmal:

    1. Die Ursprungsdaten sind in der xls-Datei zu finden. Die Text-Datei ist das was als Ergebnis raus kommen soll. Auf welche Datei beziehst Du Deine Frage? In der Textdatei steht nur in der zweiten Spalte ein "M"... in der letzten Spalte steht "4D" als String (zur Verdeutlichung). Wenn Du Dir die Datei in einem Hexeditorangeschaut hast, dann wirst Du festestellen, dass ersteres "M" hexadezimal "4D" ist.
    2. Natürlich nicht. Das ist nur eine beispielhafte Konstruktion. Ich habe auch nicht "die" Tabelle... ich generiere mir häufiger mal Testdaten in Excel und übertrage diese dann auf den Host. Das schaut natürlich jedes mal anders aus. Nur stolpere ich jedes Mal über mein Problem.
    3. Nein - das eigentliche Problem ist, dass ich die Zahl gepackt brauche.. präzise: als Cobol PIC 9(09) COMP. (können auch mal andere Längen sein).
    4. Weil ich fest Spaltenbreiten benötige.
    5. Siehe 4.

    Also... stell Dir vor: Ich möchte am Ende eine Datei haben die Sätze fester Struktur beinhaltet. Wenn ich diese Datei auf den Großrechner übertragen habe, dann lese ich die Datei dort mit einem Programm ein (ein Cobol-Programm). Im Programm wird jeder Satz in eine Cobolstruktur geschoben. Diese Struktur enthält gepackte Datenelemente.

    Wenn ich mir nun diese Datensätze in Excel generiere, dann habe ich ein Problem damit diese gepackten Datenelemente zu erzeugen. Die Cobol-Struktur zu der von mir gelieferten Beispieldatei könnte so ungefähr ausschauen:

    01 SATZ.
    05 INHALT-ERSTE-SPALTE PIC X(22).
    05 GEPACKTE-ZAHL PIC 9(02) COMP.
    05 INHALT-DRITTE-SPALTE PIC X(23).
    05 GEPACKTE-ZAHL-HEX-ALS-STRING PIC X(04)


    Wenn ich die erste Zeile meiner Textdatei in diese Struktur eingelesen habe enthält die Variable GEPACKTE-ZAHL den Wert 77.
    Bei der zweiten Zeile wäre der Wert 5848.
    Die Variable belegt aber nur zwei Bytes - ein gepacktes Datenelement.

    Ich brauche also in Excel eine Funktion, die mir aus der dezimalen Zahl eine gepackte Zahl macht.

    :D

    In Deiner mir zugesandten Excel-Datei greifst Du genau den Ansatz auf den ich auch in meinem vorigen Post meinte - Du untersuchst die Zahl auf Ihre Länge und zerlegst Sie dann in Ihre Bytes:

    z = Chr(Hex2Dec(Left(y, 2))) & Chr(Hex2Dec(Right(y, 2)))

    z enthält also genau den String den ich benötige und in die Zelle anstatt der Zahl schreiben müsste.

    Jetzt müsste die Funktion natürlch noch für jede beliebige Länge funktionieren können.. womit wir bei Rekursion wären :D
  • Hallo!

    Obwohl ich eigentlich schon raus bin...

    Zum Thema Rekursion und Länge hatte ich schon mal was mit Modulo probiert, bei meinem letzten Post. Da wollte ich noch alles durch 255 teilen. Da hab ich ja auch kaum deine Aufgabe verstanden.

    Cobol ist eine Programmiersprache, die zwar noch überall anzutreffen ist (z.B. Geldautomaten) aber aktuell ist sie nicht und erst recht lernt das keiner mehr in der Schule / im Studium. Deshalb solltest du anstelle von PIC X(22) oder PIC 9(02) COMP vielleicht so schreiben, dass wir es verstehen, wenn das möglich ist. Ich hab zwar gegoogelt, aber mach es doch einfacher, wenn du kannst.

    Ihr beide wisst ja, dass Direktlinks verboten sind, also ändert das doch mal, bevor der böse böse Mod das merkt ;) Einfach eine eigene HP bei einem kostenlosen Provider einrichten und dort den Downloadlink setzen, ist nicht viel Arbeit. Oder einfach per PM. Aber jetzt reicht es ja, wenn ihr die Links entfernt.

    Und was heißt jetzt genau gepackt? Und du sprichst dauernd von 1. 2. Spalte, bei mir kann das unterschiedlich ausgelegt werden:

    Freesoft-Board.to - we host your Files - 1 MB Upload 4 free

    Gruß

    FeliX_22
  • Hi felix,

    zu Cobol...
    also Cobol ist schon mehrfach tot geglaubt.. es lebt aber noch. Und ich kann Dir versichern, dass ich nicht freiwillig mit Cobol rummache! Oder glaubst Du etwa ich habe den angesprochenen Großrechner bei mir zu Hause rumstehen?

    Ich arbeite für den IT-Dienstleister eines der größten Versicherungs-Konzerne Deutschlands.. und glaub mir: Cobol lebt! :D ... und wir bekommen demnächst dann ganz aktuell endlich auch mal ne vernünftiges Tool zum Coden an die Hand: Rational Z (Wir haben bisher immer direkt über TSO gebastelt).

    PIC 9(04) COMP.
    Ich kann es mir also nicht aussuchen - das ist nun mal die Problemstellung - ich muss in Excel Daten so ablegen, dass Sie später in ein gepacktes Cobol Datenelement gelesen werden können.

    Dieser Datentyp ist ein zweistelliges numerisches Feld - und zwar gepackt. Ungepackt würde die Zahl 77 in diesem Feld folgender maßen hexadezimal abgelegt werden: X'F0F0F7F7'. Da das Feld gepackt ist wird die Zahl hexadezmial folgendermaßen abgelegt: X'004D'. Wie Du siehst werden nur zwei anstatt vier Bytes benötigt = gepackt.

    Das Programm ist so gegeben wie es ist. Und es wird auch immer wieder Programm geben die mit diesem Datenyp arbeiten.. und immer wenn ich mir für ein solches Programm einen Testtreiber schreibe über den ich in Excel generierte Testdaten (weil es dort so einfach ist) einlese stoße ich auf mein Problem: Wie erzeuge ich in Excel einen gepackten Datentyp?

    Testtreiber? Testdaten?
    Ich benötige eine Datei in der diverse Sätze stehen. Jeder dieser Sätze muss eine feste vorgegebene Struktur haben. Bspw. In den ersten 20 Bytes einen Text, in den nächsten vier Bytes eine Zahl und danach nochmal drei Bytes Text. Sollte ich nun eine Zeile haben in der der Text für die ersten 20 Bytes kürzer ist als 20 Bytes, so wird dieser Text natürlich mit Spaces aufgefüllt. Zahlen werden entsprechend vorgenullt.

    In Excel kann man sich sowas wunderbar zurechtbasteln. Jede Spalte in Excel entspricht dabei dann einem Datenelemtn in der festen Datenstruktur. Die erste Spalte wäre dann bspw. der 20 Bytes Text.

    Im einfachsten Falle öffne ich nach dem Erstellen der Daten einen Editor und kopiere per Copy and Paste die Daten rüber und habe meine Sätze mit fester Struktur.

    Das Problem
    Das Problem ist nur, dass ich immer wieder in dieser Struktur gepackte Daten habe. Also Zahlen entsprechend dem Cobol Datentyp wie ich ihn oben beschrieben habe. Ich kann beim Erstellen der Daten in Excel also nicht einfach die dezimale Zahl in die Spalte schreiben... beim Erstellen der späteren Datei würde dann nämlich dort die hexadezimale Zahl X'F0F0F7F7' stehen.. und ich brauche aber: X'004D'.

    Meine Beispieldatei im Hexeditor
    Also - wenn ich mich auf Spalten beziehe, dann beziehe ich mich auf Excel. Wenn ich die spätere Textdatei entsprechend als tabellerische Darstellung interpretiere würden bei gegebener fester Struktur die Daten ebenso in Spalten angeordnet sichtbar sein.

    Ich meine nicht die Spalten der Hexwerte in Deinem Hexeditor! Es gibt ja übrigens auch Hexeditoren die die Hexwerte unter dem jeweiligen Zeichen ausgeben (auf dem Großrechner ist das bspw. ganz normal).

    Wenn Du Dir die Datei im Hexeditor anschaust wirst Du sehen das in der ersten Zeile im 22. und 23. Byte X'004D' steht. Das ist die 77 aus B1 in der Beispiel-Excel-Datei! In der Textdatei steht als Text " ."

    In der zweiten Zelle findest Du im 22. und 23. Byte X'16D8' - das entspricht der Zahl 5848 in der Zelle B2 in meiner Beispiel-Excel-Datei. In der Textdatei steht als Text ".Ø".

    Die Lösung meines Problems
    Ich wäre jetzt also glücklich wenn ich eine Excel-Funktion hätte, die mir aus der "77" in B1 den Text " ." und aus der "5848" in B2 den Text ".Ø" macht.

    Wie wir nun bereits wissen ist dies möglich mit einer Funktion, wie sie nemo auch schon vorgeschlagen hat :) Diese Funktion bräuchte man jetzt für verschiedene Längen - würde man mit Rekursion arbeiten könnte Sie sogar für alle Längen verwendet werden. Denkbar wäre auch eine Funktion die einen zweiten Parameter für die Länge erhält.

    Das Folgeproblem
    Ich hatte geschrieben... "Leider wird der Shice beim Übertragen auf den Host dann gnadenlos in EBCDIC übersetzt - und bspw. ein EBCDIC "M" (77) hat leider einen andere hexadezimale Zuordnung!"

    Das bedeutet, wenn ich es geschafft habe in Excel aus einer ungepackten Zahl eine gepackte zu machen... dann habe ich beim Übertragen auf den Host das Problem, dass der Host den Text von ASCII in EBCDIC übersetzen wird. Damit wäre mein gepacktes Datenelement im Ar***....

    .. und wie das zu lösen ist steht auf einem Blatt geschrieben :D

    Directlinks
    Was die Links betrifft.... ach ja.. die Regeln :D. Hab dann mal 'ne Hombatsch für Hexen.rar gedengelt.