Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将包含XML文本的base64解码为字符串变量_Xml_Binary_Base64_Abap - Fatal编程技术网

将包含XML文本的base64解码为字符串变量

将包含XML文本的base64解码为字符串变量,xml,binary,base64,abap,Xml,Binary,Base64,Abap,我无法解码以base64格式提供的XML,字符串变量(lv_string)显示一些不可读的内容 例如: 自20 20月20日日的摩摩托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托

我无法解码以base64格式提供的XML,字符串变量(
lv_string
)显示一些不可读的内容

例如:

自20 20月20日日的摩摩托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托托nüÜ=ïÞï

代码如下:

Data: lt_content    Type standard table of x255,
      lv_xstring    Type xstring,
      lv_string     Type string,
      encod         Type Abap_encoding Value 4110.

Select Single xml_dte into @Data(xml_b64)
 From zmmvf_edocdet 
  Where numinterno = '0000000012'.

  IF Sy-subrc Eq 0.

    Call function 'SCMS_BASE64_DECODE_STR'
     Exporting
      Input         = xml_b64
     Importing
      Output        = lv_xstring
     Exceptions
      Failed        = 1
      Others        = 2.

    If Sy-subrc Eq 0.

      Data(lv_len) = xstrlen( lv_xstring ).
      Call function 'SCMS_XSTRING_TO_BINARY'
       Exporting
        buffer        = lv_xstring
       Importing
        output_length = lv_len
       Tables
        binary_tab    = lt_content[].

      Call function 'SCMS_BINARY_TO_STRING'
       Exporting
        input_length = lv_len
*        encoding     = encod
       Importing
        text_buffer  = lv_string
       Tables
        binary_tab   = lt_content[]
       Exceptions
        failed       = 1
        Others       = 2.
    ENDIF.
  ENDIF.

我过去也有过这个问题。您可以使用以下命令

data:
  lv_base64 type string,
  lv_xstring type xstring,
  lv_output type string.

* example base64 string
lv_base64 = 'PGh0bWw+PGhlYWQ+PHRpdGxlPlRpdGxlPC90aXRsZT48L2hlYWQ+PGJvZHk+PHA+SGVsbG8gV29ybGQ8L3A+PC9ib2R5PjwvaHRtbD4='.

* convert base64 to binary (xstring)
call function 'SCMS_BASE64_DECODE_STR'
    exporting
      input  = lv_base64
    importing
      output = lv_xstring
    exceptions
      failed = 1
      others = 2.

* use codepage conversion to convert xstring to string (UTF-8)
* catch possible conversion errors
  try.

      lv_output = cl_abap_codepage=>convert_from( source = lv_xstring ).

    catch cx_parameter_invalid_range .
    catch cx_sy_codepage_converter_init .
    catch cx_sy_conversion_codepage .
    catch cx_parameter_invalid_type .
  endtry.

  write lv_output.
结果是以下输出

<html><head><title>Title</title></head><body><p>Hello World</p></body></html>
TitleHello World

您可以使用其他参数控制转换,例如:

如果您希望使用不同的代码页

如果要用特殊字符替换不可见字符

如果要忽略转换错误

lv_output = cl_abap_codepage=>convert_from(
    source      = lv_xstring
    codepage    = <your favourite codepage here>
    replacement = <conversion char for not convertible chars>
    ignore_cerr = <pass 'X' to ignore conversion errors>
).
lv\u输出=cl\u abap\u代码页=>convert\u from(
source=lvxstring
代码页=
替换=
忽略\u cerr=
).

如果我们假设base64字符串在
UTF-8
编码中包含XML,那么一个简单的解决方案是使用class
CL\u HTTP\u实用程序的方法
DECODE\u base64

lv_string = cl_http_utility=>if_http_utility~decode_base64( xml_b64 ).

最小、完整且可验证的示例:

(请允许我重复使用@manuel_b的好例子)

DATA(xml_b64)=`PGh0bWw+PGhlYWQ+phrpdgxlrpdgxlpc90axrszt48l2hlywq+`
&&`PGJvZHk+PHA+SGVsbG8gV29ybGQ8L3A+PC9ib2R5PjwvaHRtbD4=`。
数据(lv_字符串)=cl_http_实用程序=>if_http_实用程序~decode_base64(xml_b64)。
ASSERT lv_string=`TitleHello World

`。
我完全按照您的方式更改了代码,但显示了相同的不可读字符串。
试试看。lv_string=cl_abap_codepage=>convert_from(source=lv_xstring codepage='ISO-8859-1'ignore_cerr='X')。捕获cx\u参数\u无效\u范围。捕获cx\u sy\u代码页\u转换器\u初始化。捕获cx\u sy\u转换\u代码页。捕获cx\u参数\u无效\u类型。结束输入base64是否可能已损坏?另外:如果你删除了ignore\u cerr,你会得到一个异常吗?我尝试了ISO-8859-1,字符串正确。我刚刚测试了您的代码,将
xml\u b64
设置为UTF-8编码的固定文本,然后设置为base64,您的代码成功解码了它。因此,数据库中的base64不包含UTF-8文本。也许它已经包含垃圾字节了。如果您不想让我们告诉您,请在这里发布base64的前100个字符(尽管不再是ABAP问题)。
DATA(xml_b64) = `PGh0bWw+PGhlYWQ+PHRpdGxlPlRpdGxlPC90aXRsZT48L2hlYWQ+`
             && `PGJvZHk+PHA+SGVsbG8gV29ybGQ8L3A+PC9ib2R5PjwvaHRtbD4=`.

DATA(lv_string) = cl_http_utility=>if_http_utility~decode_base64( xml_b64 ).

ASSERT lv_string = `<html><head><title>Title</title></head><body><p>Hello World</p></body></html>`.