mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +08:00
Fix dump when converting xstring
to bintab
Fixes dump `cx_sy_range_out_of_bounds` if the `xstring` content fits exactly into the final bintab row. Adds some more tests. Example: xstring len = 20, bintab row len 5, fills exactly 4 rows -> dump
This commit is contained in:
parent
1fac2a71e2
commit
b5bbca13fc
|
@ -85,7 +85,7 @@ CLASS zcl_abapgit_convert DEFINITION
|
||||||
VALUE(rv_xstr) TYPE xstring .
|
VALUE(rv_xstr) TYPE xstring .
|
||||||
CLASS-METHODS xstring_to_bintab
|
CLASS-METHODS xstring_to_bintab
|
||||||
IMPORTING
|
IMPORTING
|
||||||
!iv_xstr TYPE xstring
|
!iv_xstr TYPE xsequence
|
||||||
EXPORTING
|
EXPORTING
|
||||||
!ev_size TYPE i
|
!ev_size TYPE i
|
||||||
!et_bintab TYPE STANDARD TABLE .
|
!et_bintab TYPE STANDARD TABLE .
|
||||||
|
@ -144,6 +144,7 @@ ENDCLASS.
|
||||||
|
|
||||||
CLASS zcl_abapgit_convert IMPLEMENTATION.
|
CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD base64_to_xstring.
|
METHOD base64_to_xstring.
|
||||||
|
|
||||||
rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ).
|
rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ).
|
||||||
|
@ -207,32 +208,6 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD language_sap1_to_bcp47.
|
|
||||||
DATA lv_converter_instance TYPE REF TO object.
|
|
||||||
DATA lv_converter_class_name TYPE string VALUE `CL_AFF_LANGUAGE_CONVERTER`.
|
|
||||||
|
|
||||||
TRY.
|
|
||||||
CALL METHOD (lv_converter_class_name)=>create_instance
|
|
||||||
RECEIVING
|
|
||||||
result = lv_converter_instance.
|
|
||||||
|
|
||||||
TRY.
|
|
||||||
CALL METHOD lv_converter_instance->(`IF_AFF_LANGUAGE_CONVERTER~SAP1_TO_BCP47`)
|
|
||||||
EXPORTING
|
|
||||||
language = im_lang_sap1
|
|
||||||
RECEIVING
|
|
||||||
result = re_lang_bcp47.
|
|
||||||
CATCH cx_static_check.
|
|
||||||
RAISE no_assignment.
|
|
||||||
ENDTRY.
|
|
||||||
CATCH cx_sy_dyn_call_error.
|
|
||||||
TRY.
|
|
||||||
re_lang_bcp47 = lcl_bcp47_language_table=>sap1_to_bcp47( im_lang_sap1 ).
|
|
||||||
CATCH zcx_abapgit_exception.
|
|
||||||
RAISE no_assignment.
|
|
||||||
ENDTRY.
|
|
||||||
ENDTRY.
|
|
||||||
ENDMETHOD.
|
|
||||||
|
|
||||||
METHOD language_bcp47_to_sap1.
|
METHOD language_bcp47_to_sap1.
|
||||||
DATA lv_converter_instance TYPE REF TO object.
|
DATA lv_converter_instance TYPE REF TO object.
|
||||||
|
@ -289,6 +264,35 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
ENDTRY.
|
ENDTRY.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD language_sap1_to_bcp47.
|
||||||
|
DATA lv_converter_instance TYPE REF TO object.
|
||||||
|
DATA lv_converter_class_name TYPE string VALUE `CL_AFF_LANGUAGE_CONVERTER`.
|
||||||
|
|
||||||
|
TRY.
|
||||||
|
CALL METHOD (lv_converter_class_name)=>create_instance
|
||||||
|
RECEIVING
|
||||||
|
result = lv_converter_instance.
|
||||||
|
|
||||||
|
TRY.
|
||||||
|
CALL METHOD lv_converter_instance->(`IF_AFF_LANGUAGE_CONVERTER~SAP1_TO_BCP47`)
|
||||||
|
EXPORTING
|
||||||
|
language = im_lang_sap1
|
||||||
|
RECEIVING
|
||||||
|
result = re_lang_bcp47.
|
||||||
|
CATCH cx_static_check.
|
||||||
|
RAISE no_assignment.
|
||||||
|
ENDTRY.
|
||||||
|
CATCH cx_sy_dyn_call_error.
|
||||||
|
TRY.
|
||||||
|
re_lang_bcp47 = lcl_bcp47_language_table=>sap1_to_bcp47( im_lang_sap1 ).
|
||||||
|
CATCH zcx_abapgit_exception.
|
||||||
|
RAISE no_assignment.
|
||||||
|
ENDTRY.
|
||||||
|
ENDTRY.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD language_sap1_to_sap2.
|
METHOD language_sap1_to_sap2.
|
||||||
|
|
||||||
TRY.
|
TRY.
|
||||||
|
@ -381,6 +385,42 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD uccp.
|
||||||
|
|
||||||
|
DATA lv_class TYPE string.
|
||||||
|
DATA lv_xstr TYPE xstring.
|
||||||
|
DATA lo_instance TYPE REF TO object.
|
||||||
|
|
||||||
|
lv_class = 'CL_ABAP_CONV_IN_CE'.
|
||||||
|
|
||||||
|
TRY.
|
||||||
|
CALL METHOD (lv_class)=>uccp
|
||||||
|
EXPORTING
|
||||||
|
uccp = iv_uccp
|
||||||
|
RECEIVING
|
||||||
|
char = rv_char.
|
||||||
|
CATCH cx_sy_dyn_call_illegal_class.
|
||||||
|
lv_xstr = iv_uccp.
|
||||||
|
|
||||||
|
CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in
|
||||||
|
EXPORTING
|
||||||
|
codepage = 'UTF-16'
|
||||||
|
RECEIVING
|
||||||
|
instance = lo_instance.
|
||||||
|
|
||||||
|
* convert endianness
|
||||||
|
CONCATENATE lv_xstr+1(1) lv_xstr(1) INTO lv_xstr IN BYTE MODE.
|
||||||
|
|
||||||
|
CALL METHOD lo_instance->('IF_ABAP_CONV_IN~CONVERT')
|
||||||
|
EXPORTING
|
||||||
|
source = lv_xstr
|
||||||
|
RECEIVING
|
||||||
|
result = rv_char.
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD xstring_remove_bom.
|
METHOD xstring_remove_bom.
|
||||||
|
|
||||||
rv_xstr = iv_xstr.
|
rv_xstr = iv_xstr.
|
||||||
|
@ -405,10 +445,13 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
|
|
||||||
FIELD-SYMBOLS <lg_line> TYPE any.
|
FIELD-SYMBOLS <lg_line> TYPE any.
|
||||||
|
|
||||||
|
|
||||||
CLEAR et_bintab.
|
CLEAR et_bintab.
|
||||||
ev_size = xstrlen( iv_xstr ).
|
ev_size = xstrlen( iv_xstr ).
|
||||||
|
|
||||||
|
IF iv_xstr IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
|
APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
|
||||||
lv_struct = boolc(
|
lv_struct = boolc(
|
||||||
cl_abap_typedescr=>describe_by_data( <lg_line> )->type_kind = cl_abap_typedescr=>typekind_struct1 ).
|
cl_abap_typedescr=>describe_by_data( <lg_line> )->type_kind = cl_abap_typedescr=>typekind_struct1 ).
|
||||||
|
@ -418,7 +461,9 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
<lg_line> = iv_xstr.
|
<lg_line> = iv_xstr.
|
||||||
|
|
||||||
lv_length = cl_abap_typedescr=>describe_by_data( <lg_line> )->length.
|
lv_length = cl_abap_typedescr=>describe_by_data( <lg_line> )->length.
|
||||||
lv_iterations = ev_size DIV lv_length.
|
ASSERT lv_length > 0.
|
||||||
|
|
||||||
|
lv_iterations = ( ev_size - 1 ) DIV lv_length.
|
||||||
|
|
||||||
DO lv_iterations TIMES.
|
DO lv_iterations TIMES.
|
||||||
lv_offset = sy-index * lv_length.
|
lv_offset = sy-index * lv_length.
|
||||||
|
@ -493,39 +538,4 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||||
GET BIT 8 OF iv_x INTO rv_bitbyte+7(1).
|
GET BIT 8 OF iv_x INTO rv_bitbyte+7(1).
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD uccp.
|
|
||||||
|
|
||||||
DATA lv_class TYPE string.
|
|
||||||
DATA lv_xstr TYPE xstring.
|
|
||||||
DATA lo_instance TYPE REF TO object.
|
|
||||||
|
|
||||||
lv_class = 'CL_ABAP_CONV_IN_CE'.
|
|
||||||
|
|
||||||
TRY.
|
|
||||||
CALL METHOD (lv_class)=>uccp
|
|
||||||
EXPORTING
|
|
||||||
uccp = iv_uccp
|
|
||||||
RECEIVING
|
|
||||||
char = rv_char.
|
|
||||||
CATCH cx_sy_dyn_call_illegal_class.
|
|
||||||
lv_xstr = iv_uccp.
|
|
||||||
|
|
||||||
CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in
|
|
||||||
EXPORTING
|
|
||||||
codepage = 'UTF-16'
|
|
||||||
RECEIVING
|
|
||||||
instance = lo_instance.
|
|
||||||
|
|
||||||
* convert endianness
|
|
||||||
CONCATENATE lv_xstr+1(1) lv_xstr(1) INTO lv_xstr IN BYTE MODE.
|
|
||||||
|
|
||||||
CALL METHOD lo_instance->('IF_ABAP_CONV_IN~CONVERT')
|
|
||||||
EXPORTING
|
|
||||||
source = lv_xstr
|
|
||||||
RECEIVING
|
|
||||||
result = rv_char.
|
|
||||||
ENDTRY.
|
|
||||||
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
|
@ -19,6 +19,9 @@ CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FIN
|
||||||
METHODS string_to_xstring FOR TESTING RAISING zcx_abapgit_exception.
|
METHODS string_to_xstring FOR TESTING RAISING zcx_abapgit_exception.
|
||||||
METHODS xstring_to_bintab FOR TESTING.
|
METHODS xstring_to_bintab FOR TESTING.
|
||||||
METHODS xstring_to_bintab_with_field FOR TESTING.
|
METHODS xstring_to_bintab_with_field FOR TESTING.
|
||||||
|
METHODS xstring_to_bintab_initial FOR TESTING.
|
||||||
|
METHODS xstring_to_bintab_long FOR TESTING.
|
||||||
|
METHODS xstring_to_bintab_exact FOR TESTING.
|
||||||
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
|
@ -74,6 +77,87 @@ CLASS ltcl_convert IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD xstring_to_bintab_initial.
|
||||||
|
|
||||||
|
DATA lt_bintab TYPE TABLE OF w3mime.
|
||||||
|
DATA lv_size TYPE i.
|
||||||
|
DATA lv_xstr TYPE xstring.
|
||||||
|
|
||||||
|
zcl_abapgit_convert=>xstring_to_bintab(
|
||||||
|
EXPORTING
|
||||||
|
iv_xstr = lv_xstr
|
||||||
|
IMPORTING
|
||||||
|
ev_size = lv_size
|
||||||
|
et_bintab = lt_bintab ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lv_size
|
||||||
|
exp = 0 ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lines( lt_bintab )
|
||||||
|
exp = 0 ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD xstring_to_bintab_long.
|
||||||
|
|
||||||
|
DATA lt_bintab TYPE TABLE OF w3mime. " x(255)
|
||||||
|
DATA lv_bin LIKE LINE OF lt_bintab.
|
||||||
|
DATA lv_size TYPE i.
|
||||||
|
DATA lv_xstr TYPE xstring.
|
||||||
|
|
||||||
|
lv_xstr = repeat( val = '1122334455' occ = 200 ).
|
||||||
|
|
||||||
|
zcl_abapgit_convert=>xstring_to_bintab(
|
||||||
|
EXPORTING
|
||||||
|
iv_xstr = lv_xstr
|
||||||
|
IMPORTING
|
||||||
|
ev_size = lv_size
|
||||||
|
et_bintab = lt_bintab ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lv_size
|
||||||
|
exp = 1000 ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lines( lt_bintab )
|
||||||
|
exp = 4 ).
|
||||||
|
|
||||||
|
READ TABLE lt_bintab INTO lv_bin INDEX 4.
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lv_bin-line+230(10)
|
||||||
|
exp = '11223344550000000000' ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD xstring_to_bintab_exact.
|
||||||
|
|
||||||
|
TYPES ty_line TYPE x LENGTH 5.
|
||||||
|
DATA lv_xdata TYPE x LENGTH 10.
|
||||||
|
DATA lt_bintab TYPE TABLE OF ty_line.
|
||||||
|
DATA lv_size TYPE i.
|
||||||
|
|
||||||
|
lv_xdata = '1122334455FFEEDDCCBB'.
|
||||||
|
|
||||||
|
" must not dump if content fits exactly into bintab
|
||||||
|
zcl_abapgit_convert=>xstring_to_bintab(
|
||||||
|
EXPORTING
|
||||||
|
iv_xstr = lv_xdata
|
||||||
|
IMPORTING
|
||||||
|
ev_size = lv_size
|
||||||
|
et_bintab = lt_bintab ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lv_size
|
||||||
|
exp = 10 ).
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
act = lines( lt_bintab )
|
||||||
|
exp = 2 ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD string_to_xstring.
|
METHOD string_to_xstring.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user