how to decode base64 encoded zpl data back to ASCII/EBCDIC
how to decode base64 encoded zpl data back to ASCII/EBCDIC
Hi all,
i have base64 encoded zpl (label to print using zebra printer) getting from HTTPAPI call. Using base64_decode to decode and the result what i see \is not in ASCII/EBCDIC format, looks like may be in binary format. Need to convert to the format that can be print to a spool file. Please help.
i have base64 encoded zpl (label to print using zebra printer) getting from HTTPAPI call. Using base64_decode to decode and the result what i see \is not in ASCII/EBCDIC format, looks like may be in binary format. Need to convert to the format that can be print to a spool file. Please help.
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
This is my base64 encoded string. Talking to folks where i am getting this, zpl text is base64 encoded (this is not a label image). When i put this base64 encoded string in the website https://www.base64decode.org/, it does get converted to zpl. Does base64_decode routing should able to do same?
Base64 string:
XlhBCl5MTDEyMTgKXlBXODEyCl5QT04KXkxIMCwwCl5DSTI3Cl5GTzQ5NSwxOV5HQjI4NSwxNDAsNCxCLDBeRlMKXkZPNzA4LDQ5M15HQjgzLDQyLDIsQiwwXkZTCl5GTzIwMiwtMl5HQjAsMjAyLDQsQixMXkZTCl5GTzAsMjAwXkdCODExLDAsNCxCLExeRlMKXkZPMCwyODJeR0I4MTEsMCw0LEIsTF5GUwpeRk8wLDgwN15HQjgxMSwwLDgsQixMXkZTCl5GTzAsMTEwOF5HQjgxMSwwLDgsQixMXkZTCl5GTzMwLDMwCl5GQjE2MiwxLDAsTCwwCl5BME4sMTk3LDE5NwpeRkQKRgpeRlMKXkZPNTA1LDI5Cl5GQjI2NCw1LDAsQywwCl5BME4sMTksMTkKXkZEClNBTVBMRSAtIERPIE5PVCBNQUlMISEhIVwmRklSU1QtQ0xBU1MgTUFJTFwmVS5TLiBQT1NUQUdFIFBBSURcJklOVEVSTkFUSU9OQUwgQlJJREdFLCBJTkMuXCZlUE9TVEFHRQpeRlMKXkZPMTAsMjIzCl5GQjc5MSwxLDAsQywwCl5BME4sNTYsNTYKXkZEClVTUFMgRklSU1QtQ0xBU1MgUEtHCl5GUwpeRk8xMiwyOTQKXkZCNDE2LDQsMCxMLDAKXkEwTiwyMiwyMgpeRkQKSEFSUlkgV0hJVEVIT1VTRVwmSU5URU5SQVRJT05BTCBCUklER0VcJjcwIEhBWUZJRUxEUyBSRFwmUE9SVE9MQSBWQUxMRVksIENBIDk0MDI4LTcyNDkKXkZTCl5GTzExMSw1NjAKXkZCNjU5LDQsMCxMLDAKXkEwTiwyOCwyOApeRkQKUEFUUklDSyBXSElURUhPVVNFXCZQUk9EVUNUIFJFVFVSTlMgV0FSRUhPVVNFXCYyMTU3IDNSRCBBVkVcJlNBQ1JBTUVOVE8sIENBIDk1ODE4LTMxMDEKXkZTCl5GTzUwLDgyNgpeRkI3MTAsMSwwLEMsMApeQTBOLDI1LDI1Cl5GRApVU1BTIFRSQUNLSU5HICMgLSBFUApeRlMKXkZPNTAsMTA3NwpeRkI3MTAsMSwwLEMsMApeQTBOLDI1LDI1Cl5GRAo5MjAwIDEwMDAgMDAwMCAwMDAwIDcyNDcgNDQKXkZTCl5GTzEzLDQ3NgpeRkI0MTYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzEzLDUwNwpeRkI0MTYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzcxNiw1MDEKXkZCNjksMSwwLEMsMApeQTBOLDI4LDI4Cl5GRApDMDE5Cl5GUwpeRk80OTUsMTY4Cl5GQjI4OSwxLDAsQywwCl5BME4sMjUsMjUKXkZECgpeRlMKXkZPNDQ5LDM4OQpeRkIzNTUsMSwwLEwsMApeQTBOLDI4LDI4Cl5GRAoKXkZTCl5GTzQ0OSw0MjAKXkZCMzU1LDEsMCxMLDAKXkEwTiwyOCwyOApeRkQKCl5GUwpeRk80NDksNDUyCl5GQjM1NSwxLDAsTCwwCl5BME4sMjgsMjgKXkZECgpeRlMKXkZPNTkyLDI5MwpeRkIyMTMsNCwwLFIsMApeQTBOLDE4LDE4Cl5GRAowMS8yMS8yMDIyXCZNYWlsZWQgZnJvbSA5NDAyOFwmMiBvelwmCl5GUwpeRk8xNjcsMTE2MgpeRkIxODEsMSwwLEwsMApeQTBOLDE2LDE2Cl5GRApJbnRlcm5hdGlvbmFsIEJyaWRnZSBCbHVlCl5GUwpeRk80NTMsMTE0NApeRkIzNDksMywwLEwsMApeQTBOLDE0LDE0Cl5GRApQcmludCBzaGlwcGluZyBsYWJlbHMgZnJvbSBob21lXCYkMCBzaWdudXAgZmVlcywgJDAgbW9udGhseSBmZWVzLCAkMCBzdXJjaGFyZ2VzXCZTY2FuIHRoZSBRUiBjb2RlIHRvIGZpbmQgb3V0IG1vcmUKXkZTCl5GTzg4LDg4NwpeQlkzCl5CQ04sMTUyLE4sTixOLEReRkQ0MjA5NTgxOD44OTIwMDEwMDAwMDAwMDAwMDcyNDc0NF5GUwpeRk8zNjksMTEzMgpeQlFOLDIsMl5GRE1BLGJsdWUubXlpYi5jb20/dXRtX3NvdXJjZT1xcl5GUwpeRk8wLC0yXkdEODEyLDEyMTgsNCxCLExeRlMKXkZPMCwtMl5HRDgxMiwxMjE4LDQsQixSXkZTCl5YWg==
Base64 string:
XlhBCl5MTDEyMTgKXlBXODEyCl5QT04KXkxIMCwwCl5DSTI3Cl5GTzQ5NSwxOV5HQjI4NSwxNDAsNCxCLDBeRlMKXkZPNzA4LDQ5M15HQjgzLDQyLDIsQiwwXkZTCl5GTzIwMiwtMl5HQjAsMjAyLDQsQixMXkZTCl5GTzAsMjAwXkdCODExLDAsNCxCLExeRlMKXkZPMCwyODJeR0I4MTEsMCw0LEIsTF5GUwpeRk8wLDgwN15HQjgxMSwwLDgsQixMXkZTCl5GTzAsMTEwOF5HQjgxMSwwLDgsQixMXkZTCl5GTzMwLDMwCl5GQjE2MiwxLDAsTCwwCl5BME4sMTk3LDE5NwpeRkQKRgpeRlMKXkZPNTA1LDI5Cl5GQjI2NCw1LDAsQywwCl5BME4sMTksMTkKXkZEClNBTVBMRSAtIERPIE5PVCBNQUlMISEhIVwmRklSU1QtQ0xBU1MgTUFJTFwmVS5TLiBQT1NUQUdFIFBBSURcJklOVEVSTkFUSU9OQUwgQlJJREdFLCBJTkMuXCZlUE9TVEFHRQpeRlMKXkZPMTAsMjIzCl5GQjc5MSwxLDAsQywwCl5BME4sNTYsNTYKXkZEClVTUFMgRklSU1QtQ0xBU1MgUEtHCl5GUwpeRk8xMiwyOTQKXkZCNDE2LDQsMCxMLDAKXkEwTiwyMiwyMgpeRkQKSEFSUlkgV0hJVEVIT1VTRVwmSU5URU5SQVRJT05BTCBCUklER0VcJjcwIEhBWUZJRUxEUyBSRFwmUE9SVE9MQSBWQUxMRVksIENBIDk0MDI4LTcyNDkKXkZTCl5GTzExMSw1NjAKXkZCNjU5LDQsMCxMLDAKXkEwTiwyOCwyOApeRkQKUEFUUklDSyBXSElURUhPVVNFXCZQUk9EVUNUIFJFVFVSTlMgV0FSRUhPVVNFXCYyMTU3IDNSRCBBVkVcJlNBQ1JBTUVOVE8sIENBIDk1ODE4LTMxMDEKXkZTCl5GTzUwLDgyNgpeRkI3MTAsMSwwLEMsMApeQTBOLDI1LDI1Cl5GRApVU1BTIFRSQUNLSU5HICMgLSBFUApeRlMKXkZPNTAsMTA3NwpeRkI3MTAsMSwwLEMsMApeQTBOLDI1LDI1Cl5GRAo5MjAwIDEwMDAgMDAwMCAwMDAwIDcyNDcgNDQKXkZTCl5GTzEzLDQ3NgpeRkI0MTYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzEzLDUwNwpeRkI0MTYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzcxNiw1MDEKXkZCNjksMSwwLEMsMApeQTBOLDI4LDI4Cl5GRApDMDE5Cl5GUwpeRk80OTUsMTY4Cl5GQjI4OSwxLDAsQywwCl5BME4sMjUsMjUKXkZECgpeRlMKXkZPNDQ5LDM4OQpeRkIzNTUsMSwwLEwsMApeQTBOLDI4LDI4Cl5GRAoKXkZTCl5GTzQ0OSw0MjAKXkZCMzU1LDEsMCxMLDAKXkEwTiwyOCwyOApeRkQKCl5GUwpeRk80NDksNDUyCl5GQjM1NSwxLDAsTCwwCl5BME4sMjgsMjgKXkZECgpeRlMKXkZPNTkyLDI5MwpeRkIyMTMsNCwwLFIsMApeQTBOLDE4LDE4Cl5GRAowMS8yMS8yMDIyXCZNYWlsZWQgZnJvbSA5NDAyOFwmMiBvelwmCl5GUwpeRk8xNjcsMTE2MgpeRkIxODEsMSwwLEwsMApeQTBOLDE2LDE2Cl5GRApJbnRlcm5hdGlvbmFsIEJyaWRnZSBCbHVlCl5GUwpeRk80NTMsMTE0NApeRkIzNDksMywwLEwsMApeQTBOLDE0LDE0Cl5GRApQcmludCBzaGlwcGluZyBsYWJlbHMgZnJvbSBob21lXCYkMCBzaWdudXAgZmVlcywgJDAgbW9udGhseSBmZWVzLCAkMCBzdXJjaGFyZ2VzXCZTY2FuIHRoZSBRUiBjb2RlIHRvIGZpbmQgb3V0IG1vcmUKXkZTCl5GTzg4LDg4NwpeQlkzCl5CQ04sMTUyLE4sTixOLEReRkQ0MjA5NTgxOD44OTIwMDEwMDAwMDAwMDAwMDcyNDc0NF5GUwpeRk8zNjksMTEzMgpeQlFOLDIsMl5GRE1BLGJsdWUubXlpYi5jb20/dXRtX3NvdXJjZT1xcl5GUwpeRk8wLC0yXkdEODEyLDEyMTgsNCxCLExeRlMKXkZPMCwtMl5HRDgxMiwxMjE4LDQsQixSXkZTCl5YWg==
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
How about showing us the relevant parts of your code. Data defs and invocation.
You're asking us to just guess in the dark right now.
You're asking us to just guess in the dark right now.
-
- Site Admin
- Posts: 872
- Joined: Sun Jul 04, 2021 5:12 am
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Base64 will always preserve the exact same binary values that the data was encoded from. That's it's purpose.
So if it was encoded as ASCII, when you decode it, it'll also be ASCII. If when you encoded it, it was UTF-8, it will decode to UTF-8. If you encoded it as part of an image file, it will decode to the same part of the same image file.
My best guess is that you are encoding it in either ASCII or UTF-8 (I don't know what it was encoded from -- you'd have to tell me!) but expecting it'll magically be EBDCIC when you decode it. But, I dont' really know, since you have provided virtually no information about what the data is in your posts, what you are getting, or how you are approaching calling the tools.
So if it was encoded as ASCII, when you decode it, it'll also be ASCII. If when you encoded it, it was UTF-8, it will decode to UTF-8. If you encoded it as part of an image file, it will decode to the same part of the same image file.
My best guess is that you are encoding it in either ASCII or UTF-8 (I don't know what it was encoded from -- you'd have to tell me!) but expecting it'll magically be EBDCIC when you decode it. But, I dont' really know, since you have provided virtually no information about what the data is in your posts, what you are getting, or how you are approaching calling the tools.
-
- Posts: 3
- Joined: Thu Jan 13, 2022 11:07 pm
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Hoping that this helps in some way -- the encoding of the ZPL text was accomplished using this Ruby module:
https://ruby-doc.org/stdlib-2.5.3/libdo ... ase64.html
I'd also point out that a true image file will begin with a few bytes that indicate the MIME type and those bytes will be encoded to BASE64.
"jpeg" => "FFD8",
"png" => "89504E470D0A1A0A",
"gif" => "474946",
"bmp" => "424D",
"tiff" => "4949",
"tiff" => "4D4D"
In the case of ZPL text, there is no MIME type in the header. So if the base64 decoder is assuming it's an image, it could be confused when those bytes don't appear.
The Base64 in the original question fails to decode if you try this web site which is trying to convert a Base64 assuming it's an image:
https://codebeautify.org/base64-to-image-converter
But if you go to a site that doesn't assume an image, the ZPL decodes without a problem:
https://www.base64decode.org
Regards,
Harry
https://ruby-doc.org/stdlib-2.5.3/libdo ... ase64.html
I'd also point out that a true image file will begin with a few bytes that indicate the MIME type and those bytes will be encoded to BASE64.
"jpeg" => "FFD8",
"png" => "89504E470D0A1A0A",
"gif" => "474946",
"bmp" => "424D",
"tiff" => "4949",
"tiff" => "4D4D"
In the case of ZPL text, there is no MIME type in the header. So if the base64 decoder is assuming it's an image, it could be confused when those bytes don't appear.
The Base64 in the original question fails to decode if you try this web site which is trying to convert a Base64 assuming it's an image:
https://codebeautify.org/base64-to-image-converter
But if you go to a site that doesn't assume an image, the ZPL decodes without a problem:
https://www.base64decode.org
Regards,
Harry
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Here is part of the code that is relevant to find the issue: After base64_decode called when i look at value of ZplOut using debug, data looks like binary which i am giving below (value of B64In value before call to base64 routine was given in original post).
Using debug EVAL zplout:c 4000 value as given below:
;ì ;<<;&ï;&|+;<ç;äñ;ã|;åââ
;ãë;ã|;åââ;ãë;ã|;åââ<;ãë
;ã|;åââ<;ãë;ã|;åââ<;ãë;ã|
;åââ<;ãë;ã|;åââ<;ãë;ã|;ãâ
<; +;ãàã;ãë;ã|;ãâä;
+;ãàë (&<áà|+|è( ñ<*ãñêëèä< ëë( ñ<*íë
&|ëè åá& ñà*ñ+èáê+ èñ|+ <âêñàåáñ+ä*Á&|ëè åá;ãë;ã|
;ãâä; +;ãàíë&ëãñêëèä< ëë&.å;ã
ë;ã|;ãâ<; +;ãàç êêßïçñèáç|íëá*
ñ+èá+ê èñ|+ <âêñàåá*ç ßãñá<àëêà*&|êè|< î <<áßä
;ãë;ã|;ãâ<; +;ãà& èêñä
.ïçñèáç|íëá*&ê|àíäèêáèíê+ëï êáç|íëá*êà îá*ë äê
(á+è|ä ;ãë;ã|;ãâä; +
;ãàíë&ëèê ä.ñ+åá&;ãë;ã|;ãâä; +
;ãà;ãë;ã|;ãâ
<; +;ãà;ãë;ã|;ãâ<; +
;ãà;ãë;ã|;ãâä; +;ãàä;ã
ë;ã|;ãâä; +;ãà;ãë;ã|;
ãâ<; +;ãà;ãë;ã|;ãâ<
; +;ãà;ãë;ã|;ãâ<; +;ãà
;ãë;ã|;ãâê; +;ãà*(
/Ñ%ÁÀÃÊ?_*?:*;ãë;ã|;ãâ<; +
;ãàñ>ÈÁÊ>/ÈÑ?>/%âÊÑÀÅÁâ%ÍÁ;ãë;ã|;ãâ
<; +;ãà&ÊÑ>ÈËÇÑøøÑ>Å%/ÂÁ%ËÃÊ?_Ç?_Á*Ë
ÑÅ>ÍøÃÁÁË_?>ÈÇ%`ÃÁÁËËÍÊÄÇ/ÊÅÁË*ëÄ/>ÈÇÁéêÄ?ÀÁ
È?ÃÑ>À?ÍÈ_?ÊÁ;ãë;ã|;âß;âä++++à;ãà
;ãë;ã|;âé+;ãà( Â%
ÍÁ_`ÑÂÄ?_ÍÈ_¬Ë?ÍÊÄÁÉÊ;ãë;ã|;åàâ<;ãë;ã|
;åàâê;ãë;ì!
Code: Select all
D JdsNode s like(yajl_Val)
D oNode s like(yajl_Val)
D list s like(yajl_Val)
D B64In s 20000A
D ZplOut s 20000A
D B64DErr s 100A
D JdsRerr s 500A varying
result = http_string( 'POST': url: postdata: 'application/json');
JdsNode = yajl_buf_load_tree(%Addr(result): %Len(%Trim(result)):JdsRerr);
If JdsRerr = *Blank;
list = yajl_object_find( jdsNode: 'base64_labels');
i = 0;
DoW YAJL_ARRAY_LOOP(list: i: oNode);
B64In = yajl_get_string(oNode);
If B64In <> *Blank;
base64_decode( %addr(B64In)
: %len(%trimr(B64In))
: %addr(ZplOut)
: %size(ZplOut) );
If (%size(ZplOut) < 0);
B64DErr = 'LBL B64 DECODE ERROR';
Endif;
Endif;
EndDo;
EndIf;
yajl_tree_free(JdsNode);
;ì ;<<;&ï;&|+;<ç;äñ;ã|;åââ
;ãë;ã|;åââ;ãë;ã|;åââ<;ãë
;ã|;åââ<;ãë;ã|;åââ<;ãë;ã|
;åââ<;ãë;ã|;åââ<;ãë;ã|;ãâ
<; +;ãàã;ãë;ã|;ãâä;
+;ãàë (&<áà|+|è( ñ<*ãñêëèä< ëë( ñ<*íë
&|ëè åá& ñà*ñ+èáê+ èñ|+ <âêñàåáñ+ä*Á&|ëè åá;ãë;ã|
;ãâä; +;ãàíë&ëãñêëèä< ëë&.å;ã
ë;ã|;ãâ<; +;ãàç êêßïçñèáç|íëá*
ñ+èá+ê èñ|+ <âêñàåá*ç ßãñá<àëêà*&|êè|< î <<áßä
;ãë;ã|;ãâ<; +;ãà& èêñä
.ïçñèáç|íëá*&ê|àíäèêáèíê+ëï êáç|íëá*êà îá*ë äê
(á+è|ä ;ãë;ã|;ãâä; +
;ãàíë&ëèê ä.ñ+åá&;ãë;ã|;ãâä; +
;ãà;ãë;ã|;ãâ
<; +;ãà;ãë;ã|;ãâ<; +
;ãà;ãë;ã|;ãâä; +;ãàä;ã
ë;ã|;ãâä; +;ãà;ãë;ã|;
ãâ<; +;ãà;ãë;ã|;ãâ<
; +;ãà;ãë;ã|;ãâ<; +;ãà
;ãë;ã|;ãâê; +;ãà*(
/Ñ%ÁÀÃÊ?_*?:*;ãë;ã|;ãâ<; +
;ãàñ>ÈÁÊ>/ÈÑ?>/%âÊÑÀÅÁâ%ÍÁ;ãë;ã|;ãâ
<; +;ãà&ÊÑ>ÈËÇÑøøÑ>Å%/ÂÁ%ËÃÊ?_Ç?_Á*Ë
ÑÅ>ÍøÃÁÁË_?>ÈÇ%`ÃÁÁËËÍÊÄÇ/ÊÅÁË*ëÄ/>ÈÇÁéêÄ?ÀÁ
È?ÃÑ>À?ÍÈ_?ÊÁ;ãë;ã|;âß;âä++++à;ãà
;ãë;ã|;âé+;ãà( Â%
ÍÁ_`ÑÂÄ?_ÍÈ_¬Ë?ÍÊÄÁÉÊ;ãë;ã|;åàâ<;ãë;ã|
;åàâê;ãë;ì!
-
- Site Admin
- Posts: 872
- Joined: Sun Jul 04, 2021 5:12 am
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Let's examine this code:
%SIZE returns the number of bytes of memory that a variable occupies. It's not possible for %SIZE to return less than 0. In this example, %SIZE(ZplOut) will always be 20000 since that's how much memory it occupies.
If you want to check for errors, you need to use MONITOR.
Next, you aren't checking the length of the data that's output. That's not optional, the output won't be EBCDIC text, so it's not valid to use %LEN(%TRIM(ZPLOUT)). You need that length in order to work with the data after you decode it. (Although, the code you provided doesn't actually do anything with it, presumably you'll need to actually use it for something at some point?)
As I said above, the output (in this case, ZplOut) will be on whatever encoding it was originally in. However, the debugger is expecting the data to be EBCDIC. Since it's probably not EBCDIC (I find it VERY hard to believe that a Zebra API outputs EBCDIC) you'll need to treat it as the original encoding instead of EBCDIC. (Or, if you want it to be EBCDIC, you'll need to translate it.)
Code: Select all
D ZplOut s 20000A
:
:
base64_decode( %addr(B64In)
: %len(%trimr(B64In))
: %addr(ZplOut)
: %size(ZplOut) );
If (%size(ZplOut) < 0);
B64DErr = 'LBL B64 DECODE ERROR';
Endif;
If you want to check for errors, you need to use MONITOR.
Next, you aren't checking the length of the data that's output. That's not optional, the output won't be EBCDIC text, so it's not valid to use %LEN(%TRIM(ZPLOUT)). You need that length in order to work with the data after you decode it. (Although, the code you provided doesn't actually do anything with it, presumably you'll need to actually use it for something at some point?)
Code: Select all
D ZplOut s 20000A
D ZplLen s 10u 0
:
:
monitor;
ZplLen = base64_decode( %addr(B64In)
: %len(%trimr(B64In))
: %addr(ZplOut)
: %size(ZplOut) );
on-error;
B64DErr = 'LBL B64 DECODE ERROR';
endmon;
As I said above, the output (in this case, ZplOut) will be on whatever encoding it was originally in. However, the debugger is expecting the data to be EBCDIC. Since it's probably not EBCDIC (I find it VERY hard to believe that a Zebra API outputs EBCDIC) you'll need to treat it as the original encoding instead of EBCDIC. (Or, if you want it to be EBCDIC, you'll need to translate it.)
-
- Site Admin
- Posts: 872
- Joined: Sun Jul 04, 2021 5:12 am
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
I took the base64 encoded data that you provided above and dumped it into a program, then decoded it and wrote it to an ifs file. Trying to follow your lead, I used a coding style from around the 2007-ish.
This seems to work just fine for me:
This seems to work just fine for me:
Code: Select all
H dftactgrp(*no) bnddir('BASE64')
/copy ifsio_h
/copy base64_h
D stmf c '/tmp/zplData.txt'
D fd s 10i 0
D b64in s 20000a varying
D zplOut s 20000a
D zplLen s 10u 0
D cmd s 200a varying
D p_errnum s *
D errnum s 10i 0 based(p_errnum)
D get_errno pr * extproc('__errno')
D QCMDEXC pr extpgm('QSYS/QCMDEXC')
D command 32767a const options(*varsize)
D length 15p 5 const
D igc 3a const options(*nopass)
/free
b64in = 'XlhBCl5MTDEyMTgKXlBXODEyCl5QT04KXkxIMCwwCl5DSTI3Cl5GTzQ5N+
SwxOV5HQjI4NSwxNDAsNCxCLDBeRlMKXkZPNzA4LDQ5M15HQjgzLDQyLD+
IsQiwwXkZTCl5GTzIwMiwtMl5HQjAsMjAyLDQsQixMXkZTCl5GTzAsMjA+
wXkdCODExLDAsNCxCLExeRlMKXkZPMCwyODJeR0I4MTEsMCw0LEIsTF5G+
UwpeRk8wLDgwN15HQjgxMSwwLDgsQixMXkZTCl5GTzAsMTEwOF5HQjgxM+
SwwLDgsQixMXkZTCl5GTzMwLDMwCl5GQjE2MiwxLDAsTCwwCl5BME4sMT+
k3LDE5NwpeRkQKRgpeRlMKXkZPNTA1LDI5Cl5GQjI2NCw1LDAsQywwCl5+
BME4sMTksMTkKXkZEClNBTVBMRSAtIERPIE5PVCBNQUlMISEhIVwmRklS+
U1QtQ0xBU1MgTUFJTFwmVS5TLiBQT1NUQUdFIFBBSURcJklOVEVSTkFUS+
U9OQUwgQlJJREdFLCBJTkMuXCZlUE9TVEFHRQpeRlMKXkZPMTAsMjIzCl+
5GQjc5MSwxLDAsQywwCl5BME4sNTYsNTYKXkZEClVTUFMgRklSU1QtQ0x+
BU1MgUEtHCl5GUwpeRk8xMiwyOTQKXkZCNDE2LDQsMCxMLDAKXkEwTiwy+
MiwyMgpeRkQKSEFSUlkgV0hJVEVIT1VTRVwmSU5URU5SQVRJT05BTCBCU+
klER0VcJjcwIEhBWUZJRUxEUyBSRFwmUE9SVE9MQSBWQUxMRVksIENBID+
k0MDI4LTcyNDkKXkZTCl5GTzExMSw1NjAKXkZCNjU5LDQsMCxMLDAKXkE+
wTiwyOCwyOApeRkQKUEFUUklDSyBXSElURUhPVVNFXCZQUk9EVUNUIFJF+
VFVSTlMgV0FSRUhPVVNFXCYyMTU3IDNSRCBBVkVcJlNBQ1JBTUVOVE8sI+
ENBIDk1ODE4LTMxMDEKXkZTCl5GTzUwLDgyNgpeRkI3MTAsMSwwLEMsMA+
peQTBOLDI1LDI1Cl5GRApVU1BTIFRSQUNLSU5HICMgLSBFUApeRlMKXkZ+
PNTAsMTA3NwpeRkI3MTAsMSwwLEMsMApeQTBOLDI1LDI1Cl5GRAo5MjAw+
IDEwMDAgMDAwMCAwMDAwIDcyNDcgNDQKXkZTCl5GTzEzLDQ3NgpeRkI0M+
TYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzEzLDUwNwpeRk+
I0MTYsMSwwLEwsMApeQTBOLDIyLDIyCl5GRAoKXkZTCl5GTzcxNiw1MDE+
KXkZCNjksMSwwLEMsMApeQTBOLDI4LDI4Cl5GRApDMDE5Cl5GUwpeRk80+
OTUsMTY4Cl5GQjI4OSwxLDAsQywwCl5BME4sMjUsMjUKXkZECgpeRlMKX+
kZPNDQ5LDM4OQpeRkIzNTUsMSwwLEwsMApeQTBOLDI4LDI4Cl5GRAoKXk+
ZTCl5GTzQ0OSw0MjAKXkZCMzU1LDEsMCxMLDAKXkEwTiwyOCwyOApeRkQ+
KCl5GUwpeRk80NDksNDUyCl5GQjM1NSwxLDAsTCwwCl5BME4sMjgsMjgK+
XkZECgpeRlMKXkZPNTkyLDI5MwpeRkIyMTMsNCwwLFIsMApeQTBOLDE4L+
DE4Cl5GRAowMS8yMS8yMDIyXCZNYWlsZWQgZnJvbSA5NDAyOFwmMiBvel+
wmCl5GUwpeRk8xNjcsMTE2MgpeRkIxODEsMSwwLEwsMApeQTBOLDE2LDE+
2Cl5GRApJbnRlcm5hdGlvbmFsIEJyaWRnZSBCbHVlCl5GUwpeRk80NTMs+
MTE0NApeRkIzNDksMywwLEwsMApeQTBOLDE0LDE0Cl5GRApQcmludCBza+
GlwcGluZyBsYWJlbHMgZnJvbSBob21lXCYkMCBzaWdudXAgZmVlcywgJD+
AgbW9udGhseSBmZWVzLCAkMCBzdXJjaGFyZ2VzXCZTY2FuIHRoZSBRUiB+
jb2RlIHRvIGZpbmQgb3V0IG1vcmUKXkZTCl5GTzg4LDg4NwpeQlkzCl5C+
Q04sMTUyLE4sTixOLEReRkQ0MjA5NTgxOD44OTIwMDEwMDAwMDAwMDAwM+
DcyNDc0NF5GUwpeRk8zNjksMTEzMgpeQlFOLDIsMl5GRE1BLGJsdWUubX+
lpYi5jb20/dXRtX3NvdXJjZT1xcl5GUwpeRk8wLC0yXkdEODEyLDEyMTg+
sNCxCLExeRlMKXkZPMCwtMl5HRDgxMiwxMjE4LDQsQixSXkZTCl5YWg==';
zplLen = base64_decode( %addr(b64In:*data)
: %len(b64In)
: %addr(ZplOut)
: %size(ZplOut) );
// Note: This is assuming the data is UTF-8 (CCSID 1208)
// but it may be a flavor of ASCII. There's no way for
// us to know that -- so the 1208 below may be wrong.
unlink(stmf);
fd = open( stmf
: O_CREAT + O_EXCL + O_WRONLY + O_INHERITMODE
+ O_CCSID
: 0
: 1208
: 0 );
if fd = -1;
p_errnum = get_errno();
dsply ('CPE' + %char(errnum) + ' opening file');
*inlr = *on;
return;
endif;
callp write(fd: %addr(ZplOut): zplLen);
callp close(fd);
cmd = 'DSPF STMF(''' + stmf + ''')';
QCMDEXC(cmd: %len(cmd));
unlink(stmf);
*inlr = *on;
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Hi Scott,
data written to ifs file i do see as zpl data but when i check value of variable ZplOut using debug, after base64_Decode is called it still shows as binary or hexadecimal. IFS file shows data in UTF-8 because file is created with CCSID 1208?
I need to print this zpl data to spool file to send to printer. How to do that? Here what i am doing (after zpl data written to ifs) to achieve what i need:
- Created a physical file DMYPRTFL with as400 default CCSID 65535: CRTPF FILE(TEST1/DMYPRTFL) RCDLEN(132)
- these few lines added to code
cmd = 'CPY OBJ(' + #Quote + stmf + #Quote + ') ' +
'TOOBJ(' + #Quote + 'dmyprtfl' +
#Quote + ') FROMCCSID(*OBJ) ' +
'TOCCSID(*JOBCCSID) DTAFMT(*TEXT) REPLACE(*YES)';
QCMDEXC(cmd: %len(cmd));
CMD = 'CPYF FROMFILE(dmyprtfl) TOFILE(QSYSPRT)';
QCMDEXC(cmd: %len(cmd));
No data getting copied to DMYPRTFL after CPY OBJ command.
data written to ifs file i do see as zpl data but when i check value of variable ZplOut using debug, after base64_Decode is called it still shows as binary or hexadecimal. IFS file shows data in UTF-8 because file is created with CCSID 1208?
I need to print this zpl data to spool file to send to printer. How to do that? Here what i am doing (after zpl data written to ifs) to achieve what i need:
- Created a physical file DMYPRTFL with as400 default CCSID 65535: CRTPF FILE(TEST1/DMYPRTFL) RCDLEN(132)
- these few lines added to code
cmd = 'CPY OBJ(' + #Quote + stmf + #Quote + ') ' +
'TOOBJ(' + #Quote + 'dmyprtfl' +
#Quote + ') FROMCCSID(*OBJ) ' +
'TOCCSID(*JOBCCSID) DTAFMT(*TEXT) REPLACE(*YES)';
QCMDEXC(cmd: %len(cmd));
CMD = 'CPYF FROMFILE(dmyprtfl) TOFILE(QSYSPRT)';
QCMDEXC(cmd: %len(cmd));
No data getting copied to DMYPRTFL after CPY OBJ command.
Re: how to decode base64 encoded zpl data back to ASCII/EBCDIC
Data was not getting copied to dmyprtfl because i did not specify full path in toobj parameter. Changed to as given below and it works fine. I am able to send zpl to spool file.
cmd = 'CPY OBJ(' + #Quote + stmf + #Quote + ') ' +
'TOOBJ(' + #Quote + '/qsys.lib/test1.lib/' +
'dmyprtfl.file/dmyprtfl.mbr' +
#Quote + ') FROMCCSID(*OBJ) ' +
'TOCCSID(*JOBCCSID) DTAFMT(*TEXT) REPLACE(*YES)';
Question:
- Is there any better way to print zpl data to spool?
- why zplout variable after encoding does not show data in ascii, if i want to save this value to a table field, will that be in ascii?
cmd = 'CPY OBJ(' + #Quote + stmf + #Quote + ') ' +
'TOOBJ(' + #Quote + '/qsys.lib/test1.lib/' +
'dmyprtfl.file/dmyprtfl.mbr' +
#Quote + ') FROMCCSID(*OBJ) ' +
'TOCCSID(*JOBCCSID) DTAFMT(*TEXT) REPLACE(*YES)';
Question:
- Is there any better way to print zpl data to spool?
- why zplout variable after encoding does not show data in ascii, if i want to save this value to a table field, will that be in ascii?