View Full Version : open IFS-File CodePage-Probleme
JonnyBrazil
16-03-07, 11:18
Hallo
ich habe eine .jpg-Datei im IFS stehen und will aus dieser mit RPG die EXIF-daten auslesen. Dabei gibts aber sichtlich ein Problem mit der Datenkonvertierung.
Mit EDTF sehe ich folgendes:
- - - - + - - - - * - - - - + - - - - * ----+----*----+----*
FFD8FFE1 38454578 69660000 49492A00 0A Ï ß8EExif II*
wenn ich das einlese entsteht dieses:
*...+....1....+....2....+....3..
Xa8EExifII*
0E08FCCA8800CC501000000000400030
77718557960099C06000C0E120000050
Alle Buchstaben werden richtig übersetzt, die restlichen Hexdaten allerdings falsch.
Die Anfangszeichen "FFD8FFE1" werden zu "07E70781"
Die Verarbeitung erfolgt in RPG:
D FileIn S 80A
D FileId S 10I 0
D FullName S 128A
D DataIn S 10000A
D DataPtr S * Inz(%addr(DataIn))
D Length S 10I 0 Inz(%size(DataIn))
D BytesRead S 10I 0
D O_RDONLY S 10I 0 INZ(1)
D S_IRWXU S 10I 0 INZ(448)
D O_TEXTDATA S 10I 0 INZ(16777216)
D O_CODEPAGE S 10I 0 INZ(8388608)
D CodePage S 10U 0 INZ(850)
EVAL FileID = open(%ADDR(FullName)
: O_RDONLY + O_CODEPAGE + O_TEXTDATA
: S_IRWXU : Codepage)
EVAL BytesRead = read(FileID : DataPtr : Length)
mit Codepage 37 funktioniert es übrigens auch nicht. Kann mir jemand einen guten Tipp geben was ich ändern muss?
hans
Die Bilddatei musst du binär eröffnen (CCSID 65535).
Die Klartextdaten musst du dann selber per API übersetzen:
iSeries Information Center (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/apis/iconvopn.htm)
Wobei das API CDRCVRT gut funktioniert.
Hallo,
ich hätte jpg bisher für Binaärdaten gehalten und selbige mal ohne das O_TEXTDATA Flag geöffnet.
mfg
Dieter Bender,
der kein jpg Experte ist
Hallo
ich habe eine .jpg-Datei im IFS stehen und will aus dieser mit RPG die EXIF-daten auslesen. Dabei gibts aber sichtlich ein Problem mit der Datenkonvertierung.
Mit EDTF sehe ich folgendes:
- - - - + - - - - * - - - - + - - - - * ----+----*----+----*
FFD8FFE1 38454578 69660000 49492A00 0A Ï ß8EExif II*
wenn ich das einlese entsteht dieses:
*...+....1....+....2....+....3..
Xa8EExifII*
0E08FCCA8800CC501000000000400030
77718557960099C06000C0E120000050
Alle Buchstaben werden richtig übersetzt, die restlichen Hexdaten allerdings falsch.
Die Anfangszeichen "FFD8FFE1" werden zu "07E70781"
Die Verarbeitung erfolgt in RPG:
D FileIn S 80A
D FileId S 10I 0
D FullName S 128A
D DataIn S 10000A
D DataPtr S * Inz(%addr(DataIn))
D Length S 10I 0 Inz(%size(DataIn))
D BytesRead S 10I 0
D O_RDONLY S 10I 0 INZ(1)
D S_IRWXU S 10I 0 INZ(448)
D O_TEXTDATA S 10I 0 INZ(16777216)
D O_CODEPAGE S 10I 0 INZ(8388608)
D CodePage S 10U 0 INZ(850)
EVAL FileID = open(%ADDR(FullName)
: O_RDONLY + O_CODEPAGE + O_TEXTDATA
: S_IRWXU : Codepage)
EVAL BytesRead = read(FileID : DataPtr : Length)
mit Codepage 37 funktioniert es übrigens auch nicht. Kann mir jemand einen guten Tipp geben was ich ändern muss?
hans
Bilddateien können einen Anhang im Klartext enthalten (wird im Windwosexplorer dann als erweiterte Eigenschaften angezeigt) die die Kameradaten beinhalten (Auflösung, name, Hersteller, Farbmodell usw.).
Diese Daten werden eben als EXIF-Daten bezeichnet.
JonnyBrazil
16-03-07, 11:54
Das funkt auch:
Ich übersetze den Inputstring auf EBCDIC und lese dann die Binärdaten aus dem originalstring und die Zeichen aus dem EBCDIC-String.
schaut nun so (grün=EBCDIC) aus:
*...+....1....+....2....+....3....+....4....+....5 ....+....6....+....7....+....8
Q÷ááÌÑÃññÆ ´OÓ
FDFE34476600442000000000002000900000001000B0001000 1000D00010000000000010000000E0
F8F18558960099A08000C0E1200000E000F1204000E0000120 10006000213010001000A1501000E0
Xa8EExifII* >Vn
0E08FCCA8800CC501000000000400030000000300060001000 1000E0001000000000003020000090
77718557960099C06000C0E12000005000F120C000E0000120 10005000213010001000F1D0100050
6Ú ÑgvD
0010000000F00020000000000030000000F000300010001000 100000000000680000002000AC0000
00B1501000600081301000200011208000E00021204000E100 323010002000974010006200547041
v(1ß2 i&%D
0020200000A000400000000000F0001000A000F00030003000 1000000000008230000050006C2030
0071D010005000D130100020001120600010002120C0005100 3230100020009F7010000200C4F071
o!<~(&íëàñåñè <{ (áê !<~(&íë{!ê&!ê èñ!+ìàÜ{
00300090004454555244445442444454222222222044545552 445545454440000053332433352433
0021006400FC9D0530497941C031D5210000000000FC9D0530 3F20F2149FE000008200C4560AC335
2OLYMPUS DIGITAL CAMERA OLYMPUS CORPORATIONX200,D560Z,C35
00F0003300DDEDDEE4CCCCECD4CCDCDC4444444440DDEDDEE4 CDDDDDCECDD00000EFFF6CFFFE6CFF
00210027006384742049793130314591000000000063847420 36976913965000007200B45609B335
JonnyBrazil
24-10-07, 14:19
Inzwischen kann ich schon die Bildgrösse mittels RPG aus dem .jpg auslesen, aber im Moment hänge ich bei einem seltsamen Fehler.
C EVAL FileID = open(%ADDR(FullName)
C : O_RDONLY + O_CODEPAGE
C : S_IRWXU : Codepage)
C IF FileID = -1
C EVAL msg_data = 'Failed to open file "' +
C %TRIM(FullName) +'". ' + geterrinfo
C Msg_Data DUMP
C GOTO endpgm
C ENDIF
in msg_data steht folgendes: Failed to open file "/Archiv/Moa/MAD020C.txt". - 3.452 : Zu viele offene Dateien für diesen Prozeß.
Ich finde zu diesem Fehler 3452 keine Erklärung.
Irgendeine Idee dazu?
Im Gegensatz zu DB-Dateien gibts bei C-Funktionen für das IFS eine Beschränkung der Anzahl gleichzeitig geöffneter IFS-Dateien.
Wenn du eine Datei öffnest, musst du diese auch explizit schließen, sonst bleibt sie bis zum Jobende geöffnet.
Irgendwann sind alle File-Descriptoren belegt und kein Open geht mehr.
Ein RCLRSC/RCLACTGRP hilft da meines Wissens nicht.
JonnyBrazil
24-10-07, 14:46
Ich mache bei Programmende immer ein
EVAL ReturnInt = close(FileID)
Aber ich habe nun am Programmanfang noch diese Befehle eingebaut:
C FOR FileId = 1 to 1000
C EVAL ReturnInt = close(FileId)
C ENDFOR
und das hat sichtlich geholfen. Danbke vür die Unterstützung.
Diese Schleife solltest du aber nur zu Testzwecken verwenden, da du damit ggf. geöffnete IFS-Dateien des Job's anderer aktiver Programme (Stack/Actgrp) schließt !!!
Die FileId ist nähmlich Unique für den Job/Thread.
Es kann da schon mal beim Testen dazu führen, dass man das Programm abbricht bevor der Close erreicht wird.
JonnyBrazil
25-10-07, 09:41
Ist klar, habe ich schon wieder entfernt.
Die EXIF-Daten kann ich noch nicht auslesen, aber die Bildgrösse von JPG und GIF geht schon super. Mit RPG!