PDA

View Full Version : Binary in Packed.



Seiten : [1] 2

dholtmann
12-05-17, 07:30
Hallo zusammen,

ich versuche Byte-Werte wieder in das Packed Format zu überführen.
Dafür habe ich Folgendes versucht:


D DS_Test DS
D $$_Byte 2B 0 Byte................
D $$_Packed 3P 0 overlay($$_Byte) Dateiname...........

Das funktioniert auch für 2B in 3P.
Möchte ich aber 5B und 8P verwenden, erhalte ich den Fehler:
"Mit dem Schlüsselwort OVERLAY definiertes Unterfeld ist zu groß"

Stimmt da einfach mein Größenverhältnis nicht?
5B sollte doch auf 8P und 9P passen?

Grundlage meiner Annahme ist:


SELECT DBIILN, DBINLN
FROM qadbilfi
where DBIITP = 'P'
group by DBIILN, DBINLN
order by dbinln asc

Fuerchau
12-05-17, 08:20
Also Binary in Packed geht so ja gar nicht, da du bei Packed ja ein Vorzeichen in der rechten Tetrade hast.
Oder wofür soll das gut sein?
Wenn du mit SQL umgehst gib in Zielvariablen doch direkt den korrekten Typ an:

5I 0 = 2-Byte Binär
10I 0 = 4 Byte Binär
20I 0 = 8 Byte Binär

Statt I kann man nun auch U für Unsigned verwenden.

BenderD
12-05-17, 08:24
... wieso reicht da keine einfache Zuweisung - oder stehe ich da auf dem Schlauch und habe das Problem nicht erkannt?

D*B

dholtmann
12-05-17, 08:25
Also das Problem ist, dass wir diese Werte aus einem Pointer bekommen. Char und Zoned können wir umsetzen, an packed hakt es.

Genau, ne passende Zuweisung suchen wir.

Fuerchau
12-05-17, 08:31
Auch mit Pointer (based Struct) kannst du statt 4B o.ä. nun besser die I-Varianten verwenden.
Diese werden nun native unterstützt, eine Umwandlung in Packed ist nicht mehr erforderlich.
B-Typen sind noch OPM.

BenderD
12-05-17, 08:31
... wenn das dazu dienen soll ein record image eines Triggers aufzulösen, das würde ich mir ersparen (da kann man das gesamte Image auf eine passende DS schieben und das wars). Ansonsten brauchst Du doch nur den Pointer mit der Adresse des passenden Felds mappen und den Wert auslesen.
Eleganter und besser lesbar geht das mit einer subprocedure, die den passender Typ per reference erwartet.

D*B

dholtmann
12-05-17, 08:37
Danke euch Beiden! Nein das ist nicht für ein record image (das wäre zu schön :D).
Wir versuchen jetzt mal beide Methoden. Eine Subprocedure soll es eh werden, versuche sinnvolle Abschnitte immer so zu gliedern.

BenderD
12-05-17, 09:14
... geht auch ganz konventionell:
- passende Variablen per overlay mit alpha vars überlagern
- auf eine Alpha variable mappen
- mit %subst auf die passende draufheben
- auslesen

Vermeiden sollte man immer die "Kaninchen aus dem Hut" Variante sprich: Zuweisung an x, Weiterverarbeitung von y und man sieht erst, was wirklich passiert, wenn man 3 Seiten hochblättert. Das alleine spricht schon für subprocedures. Bei y = hex2packed4 (x) sieht man intuitiv, was da passiert.

D*B

Pikachu
12-05-17, 09:44
Das funktioniert auch nicht für 2B in 3P !!!

Binär und Gepackt haben intern völlig unterschiedliche Darstellungen.
Die Zahl vor dem Typ steht außerdem für die Anzahl der Ziffern.
Die Anzahl der intern tatsächlich benötigten Bytes wird von RPG selbst bestimmt.

Warum könnt ihr mit binären Feldern nicht direkt arbeiten?


ich versuche Byte-Werte wieder in das Packed Format zu überführen.
Dafür habe ich Folgendes versucht:


D DS_Test DS
D $$_Byte 2B 0 Byte................
D $$_Packed 3P 0 overlay($$_Byte) Dateiname...........

Das funktioniert auch für 2B in 3P.
Möchte ich aber 5B und 8P verwenden, erhalte ich den Fehler:
"Mit dem Schlüsselwort OVERLAY definiertes Unterfeld ist zu groß"

Stimmt da einfach mein Größenverhältnis nicht?
5B sollte doch auf 8P und 9P passen?

dholtmann
12-05-17, 10:54
Hallo zusammen, danke für eure Tips.
habe es jetzt so gelöst, dass ich den ersten Trigger auf ein AlphaFeld mappe, den Substring in ein neues Alphafeld schiebe, darauf einen neuen Pointer setze und den als Basis für ein packed Feld nehme.


D newpointer S *


D APacked8 S 5A
D Packed8 S 8P 0 Based(newpointer)




c eval APacked8 = %subst($$_Var:1:byteleng)
c eval newpointer = %addr(APacked8)