× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Greg,
I think it is a "fool's errand" to try to search the encoded string in hex -- here is a brief explanation of why that is so.

Even if you find the hex representation for that particular substring in a given instance of an encoded string, you cannot "search" for it as a "pattern" in any general string, because BASE64 is based on a 6-bit encoding, that is, it looks at each 6 bits of the input data, to generate the next "printable ASCII character"... :-o
So, depending on where the "^XZ" happens to fall within the string, it will be encoded quite differently each time, depending on the length of the string and what else is around it. 

Just saying ...   HEADS UP!
You need to use BASE64 to "decode" the string into a character representation, in a known character set, and then search that string.
Note that if you are doing anything "tricky" like declaring a variable to be a certain CCSID on the "declare" statement (or D-spec), you cannot then use a literal in the search, such as coding "%scan('^XZ', base64decoded) " because you do not know what the compiler will decide should be the correct CCSID to use for any "literals" coded in your program.  Normally, I think it defaults to the job's CCSID of the job in which the program was compiled ... :-o
So, you really need to try to understand what's going on, with regard to all those CCSIDs, etc.
Hope that helps,

All the best,
Mark S. Waterbury

On Tuesday, August 18, 2020, 1:42:35 PM EDT, Greg Wilburn <gwilburn@xxxxxxxxxxxxxxxxxxxxxxx> wrote:

Sorry to ask, but how do I look at the base64Decoded in hex?

-----Original Message-----
From: RPG400-L [mailto:rpg400-l-bounces@xxxxxxxxxxxxxxxxxx] On Behalf Of Jon Paris
Sent: Tuesday, August 18, 2020 11:52 AM
To: RPG programming on IBM i <rpg400-l@xxxxxxxxxxxxxxxxxx>
Subject: Re: Manipulating a decoded UTF8 string

If it works even though you can't find the ^XZ' then one of two things is happening.

1) The ^XZ' isn't there at all or
2) It is there but due to charset changes it doesn't _appear_ as that character string.

The second one seems to be the most likely. i.e. you are scanning for the wrong value.  Look at the value in base64Decoded in hex.  Identify the position where the '^XZ' should be and identify the hex representation. Then scan for that,

For that matter you should be able to identify the base64 encoded version of that sequence.



On Aug 18, 2020, at 11:27 AM, Greg Wilburn <gwilburn@xxxxxxxxxxxxxxxxxxxxxxx> wrote:

Jon,

I'm receiving a SOAP XML response from the Endicia Label Server (Stamps.com) API when requesting a postage label.  The response contains an element <Base64LabelImage> that contains the base64 encoded ZPLII string to produce the label (it can actually contain up to 4 label strings).

I'm using HTTPAPI to make the request and parse the response:

    rc = http_post_xml(
        url
      : %addr(soap) + 2
      : %len(soap)
      : %paddr(StartOfElement)
      : %paddr(EndOfElement)
      : %addr(userData)
      : HTTP_TIMEOUT
      : *omit
      : 'text/xml; charset=UTF-8; ' + GETLABELACTION
      );

Inside the EndOfElement() procedure I base64_decode the value received... I'm not sure what else I would do with it??

    dcl-s base64encoded      varchar(65535) inz;
    dcl-s base64decoded      char(65535) inz;
    dcl-s len                uns(10) inz;

      when name = 'Base64LabelImage';
        base64Encoded = value;
        len = base64_decode( %addr(base64Encoded:*data)
                            : %len(%trim(base64Encoded))
                            : %addr(base64Decoded)
                            : %size(base64Decoded)
                            );
        GetLabelResponse.label(1) = %subst(base64Decoded:1:len);

I then write the label(s) data to IFS files before sending them directly to the appropriate Zebra Printer.
      For x = 1 to labelCount;
          labelFd = open(labelFile(x):flag:mode:1208:0);    // Label is UTF8 per Endicia Label Server Support
          Ifs_Write(labelFd:GetLabelResponse.label(x));
          Ifs_CloseFile(labelFd);
      Endfor;

This is working flawlessly.

For one particular process we do, I need to add text data to the END of the label... I want to do this just before I write the label to the IFS file.

To do this:
1. I scan the label data for '^XZ' (end of label)
2. I replace with ''
3. I add my string of ZPLII (generated by another service program) and '^XZ' (end of label)

The issue I'm encountering:

I'm not "Finding" the '^XZ' when I scan GetLabelResponse.label(x).
When I display the variable in debug, it looks nothing like the data written to the IFS - I can't "see" the '^XZ' (or any ZPLII characters).  But when I write it to the IFS, it appears perfect in Notepad and it prints perfectly.

Things I've tried:
Place the label data into a variable with CCSID(1252) I can scan and find the string and manipulate it in RPG, but then I can't seem to write it to the IFS correctly.
Place the label data into a variable with CCSID(1208) I receive An error occurred during conversion from CCSID(1208) to CCSID(937)
*This particular label contains the superscript "TM" symbol

Maybe I'm still doing something wrong??
I'm at a loss.

Greg


-----Original Message-----
From: RPG400-L [mailto:rpg400-l-bounces@xxxxxxxxxxxxxxxxxx] On Behalf Of Jon Paris
Sent: Monday, August 17, 2020 4:55 PM
To: RPG programming on IBM i <rpg400-l@xxxxxxxxxxxxxxxxxx>
Subject: Re: Manipulating a decoded UTF8 string

Can you show us what you were trying?

Hex or Char would make no difference - which indicates that your character version is wrongly coded.

%Scan ( X'F1' : xxxxx ) will produce the same result as %Scan ( char : xxxxx ) where "char" has the value X'F1'.

I also don't see why you need to "decoding the string into an RPG variable" - past experience should have shown you by now that therein lie problems <grin>

If %Scan can find the string then %ScanRpl will find the string and replace it for you.



On Aug 17, 2020, at 4:44 PM, Greg Wilburn <gwilburn@xxxxxxxxxxxxxxxxxxxxxxx> wrote:

So in another thread I got some help using base64_decode to decode an XML element and write that to the IFS specifying CCSID (1208).

They data is a ZPLII label string.  I need to scan for value that represents the "end" of the label and replace that value with my own string BEFORE I write it to IFS.

The issue is that upon decoding the string into an RPG variable, I can't seem to find (%SCAN) find the value.  If I scan for the hex equivalent I can find it.  But then I'm not sure how to add my string?
Do I have to convert everything to hex to manipulate that RPG variable?

I've tried messing with CCSIDs on the RPG Variables, but didn't have much luck.

What am I missing?

Thanks,
Greg

--
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related questions.

Help support midrange.com by shopping at amazon.com with our affiliate link: https://amazon.midrange.com

--
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related questions.

Help support midrange.com by shopping at amazon.com with our affiliate link: https://amazon.midrange.com
--
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related questions.

Help support midrange.com by shopping at amazon.com with our affiliate link: https://amazon.midrange.com


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.