现需要把一个数值的字符进行压缩,当前想到的简单办法就是把数值进行进制转换,比如把4位的10进制的数值,转换成26(只26个大写字母)进制的字符,这样三位的26进制字母就可以表示,26*26*26 = 17576 的10进制值了,这样,至少我们也就可以把4位的10进制值(最大9999),转换成3位的26进制,
也就是四位长度10进制数值变成用三位长度的26进制进行表示,来达到了压缩的目的,这也是一个26进制转的例子,
具体结果验证在在https://tool.lu/hexconvert/进行对比度验证,
此方法压缩率并不高,如需要压缩时,可使用
哈夫曼压缩算法(Huffman compression)关于此方法的具体说明可以从百度找到很多细节,在SAP中,也使用了此方法,SAP保存的程序时,就是通过此方法压缩后保存到表REPOSRC中的DATA字段中的,
但此压缩算法对短字符(几十个长度以下)串的压缩率不高,对长字符串有很好的压缩率,此方法我在SAP没找到直接的可使用的函数,但如需要时我们可以考虑如下方法使用
其它加密码算法:AES加密可参看:https://github.com/Sumu-Ning/AES
新版本的可以试试下面这个,
=======================================================
1.1.加压缩(加密):
INSERT REPORT REP FROM SRC PROGRAM TYPE SUBC.
把字符串,当做一个程序内容保存,然后从表REPOSRC中读出DATA字段的值,就是加密后的内容了,此方法对长数据有很大的压缩率,由于加密后数据有数据头,所以短数据时也有固定长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
*加密 DATA: BEGIN OF SRC OCCURS 1, TXT(255) TYPE C, END OF SRC. DATA: L_REP LIKE TRDIR-NAME VALUE 'SESSIONTOKEN', L_DATA TYPE xSTRING. SRC-TXT = L_SESSION. APPEND SRC. INSERT REPORT L_REP FROM SRC . COMMIT WORK. SELECT SINGLE DATA INTO L_DATA FROM REPOSRC WHERE PROGNAME = L_REP. O_TOKEN = L_DATA. |
2.2.解压缩(解密):
直接把需解压的字符串使用UPDATE(INSERT)表REPOSRC的DATA字段值,
然后READ REPORT REP INTO SRC.就能得到解压的值了
———————————————————————————————
3.10进制与26进制转换
的描述及代码:
自然数[0-25] 分别表示 [A-B]
比如:0 -> A
1->B
2->C
25->Z
26->BA
2019->CZR
一、10进制数值转换为26进制(只26个大写字母)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
FUNCTION Z10TO26. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" REFERENCE(N) TYPE INT4 DEFAULT 2019 *" EXPORTING *" REFERENCE(S) TYPE CHAR10 *"---------------------------------------------------------------------- DATA: L_N TYPE INT4, L_M TYPE I, L_MN TYPE I. DATA: L_RET TYPE CHAR10, L_C TYPE STRING. DATA: L_XSTR TYPE XSTRING. DATA: L_CON TYPE REF TO CL_RPE_CONVERT . L_N = N. IF L_N = 0. L_RET = 'A'. ENDIF. CREATE OBJECT L_CON. WHILE L_N > 0 . L_M = L_N MOD 26. L_MN = L_M + 65."A-Z 的ASCii MOVE L_MN TO L_XSTR."进制值。 CALL METHOD L_CON->XSTRING_TO_STRING EXPORTING INPUT = L_XSTR IMPORTING OUTPUT = L_C."A-Z. CONCATENATE L_C L_RET INTO L_RET. L_N = ( L_N - L_M ) / 26. ENDWHILE. S = L_RET. ENDFUNCTION. |
二、26进制(只26个大写字母)转换为10进制数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
FUNCTION Z26TO10. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" REFERENCE(S) TYPE CHAR10 DEFAULT 'CZR' *" EXPORTING *" REFERENCE(N) TYPE INT4 *"---------------------------------------------------------------------- DATA: L_N TYPE INT4, L_M TYPE I, L_MN TYPE I. DATA: L_LEN TYPE I, II TYPE I. DATA: L_S TYPE CHAR10, L_C TYPE STRING. DATA: L_XSTR TYPE XSTRING. DATA: L_CON TYPE REF TO CL_RPE_CONVERT . L_S = S. L_LEN = STRLEN( L_S ). CREATE OBJECT L_CON. L_N = 0. II = 0. DO L_LEN TIMES. L_C = L_S+II(1). CALL METHOD L_CON->STRING_TO_XSTRING EXPORTING INPUT = L_C"A-Z. IMPORTING OUTPUT = L_XSTR. MOVE L_XSTR TO L_M. L_M = L_M - 65. L_N = L_N + L_M * ( 26 ** ( L_LEN - II - 1 ) ) . II = II + 1. ENDDO. N = L_N . ENDFUNCTION. |