mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 11:46:38 +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 .
|
||||
CLASS-METHODS xstring_to_bintab
|
||||
IMPORTING
|
||||
!iv_xstr TYPE xstring
|
||||
!iv_xstr TYPE xsequence
|
||||
EXPORTING
|
||||
!ev_size TYPE i
|
||||
!et_bintab TYPE STANDARD TABLE .
|
||||
|
@ -144,6 +144,7 @@ ENDCLASS.
|
|||
|
||||
CLASS zcl_abapgit_convert IMPLEMENTATION.
|
||||
|
||||
|
||||
METHOD base64_to_xstring.
|
||||
|
||||
rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ).
|
||||
|
@ -207,32 +208,6 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
|||
|
||||
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.
|
||||
DATA lv_converter_instance TYPE REF TO object.
|
||||
|
@ -289,6 +264,35 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
|||
ENDTRY.
|
||||
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.
|
||||
|
||||
TRY.
|
||||
|
@ -381,6 +385,42 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
|||
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.
|
||||
|
||||
rv_xstr = iv_xstr.
|
||||
|
@ -405,10 +445,13 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
|
|||
|
||||
FIELD-SYMBOLS <lg_line> TYPE any.
|
||||
|
||||
|
||||
CLEAR et_bintab.
|
||||
ev_size = xstrlen( iv_xstr ).
|
||||
|
||||
IF iv_xstr IS INITIAL.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
|
||||
lv_struct = boolc(
|
||||
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.
|
||||
|
||||
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.
|
||||
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).
|
||||
|
||||
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.
|
||||
|
|
|
@ -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 xstring_to_bintab 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.
|
||||
|
||||
|
@ -74,6 +77,87 @@ CLASS ltcl_convert IMPLEMENTATION.
|
|||
|
||||
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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user