PDA

View Full Version : open IFS-File CodePage-Probleme



Seiten : [1] 2

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

Fuerchau
16-03-07, 11:31
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.

BenderD
16-03-07, 11:38
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

Fuerchau
16-03-07, 11:41
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?

Fuerchau
24-10-07, 14:41
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.

Fuerchau
24-10-07, 15:40
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!