2 個 URL(DD) 就搞定了
1 個 Input, 1 個 Output
VA evt_Table_Conversion_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
BF szOutputString = ""
VA evt_Count_Char_INT01 = 3
VA evt_Count_BinNo6_INT01 = 4
VA evt_Length_BinNo8_INT01 = 8
VA evt_Length_BinNo6_INT01 = 6
VA evt_Input_Temporary_URL = [BF szInputString]
VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
//
While VA evt_Length_Input_INT01 is greater than <Zero>
VA evt_Index_Char_INT01 = 1
VA evt_BinNo_Length24_DSSP = ""
While VA evt_Index_Char_INT01 is less than or equal to VA evt_Count_Char_INT01
And VA evt_Length_Input_INT01 is greater than <Zero>
// 取出 1 個字元 (重複 3 次)
VA evt_Char_FromInput_EV01 = substr([VA evt_Input_Temporary_URL],0,1)
VA evt_Input_Temporary_URL = substr([VA evt_Input_Temporary_URL],1,
[VA evt_Length_Input_INT01])
VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
//
// 將取出的字元轉為 ASCII
// (Character to Math Numeric, Convert : B0000049)
// 為什麼使用 B0000049 ? 因為我找不到可以直接將字轉為 ASCII 的 BF
// B0000049 是以'0'為起始, 所以要加上 48 轉為 ASCII (ASCII 表中'0'的 10 進位為 48)
Character to Math Numeric, Convert
VA evt_Char_FromInput_EV01 -> BF cCharacter
VA evt_ASCIINo_FromChar_MATH01 <- BF mnMathNumeric
VA evt_ASCIINo_FromChar_MATH01 = [VA evt_ASCIINo_FromChar_MATH01]+48
//
// 將 ASCII 轉為 2 進位 (Binary), 並補齊 8 bits (左側補'0')
// (Convert From Deciaml Number To Binary Number : B46R0210)
Convert From Deciaml Number To Binary Number
VA evt_ASCIINo_FromChar_MATH01 -> BF mnDecimalNumber
VA evt_BinNo_Length8_A801 <- BF szBinaryNumber
VA evt_BinNo_Length8_A801 = lpad([VA evt_BinNo_Length8_A801],"0",
[VA evt_Length_BinNo8_INT01])
//
// 將 binary 數字整理為 3 Bytes (24 bits)
VA evt_BinNo_Length24_DSSP = concat([VA evt_BinNo_Length24_DSSP],
[VA evt_BinNo_Length8_A801])
//
VA evt_Index_Char_INT01 = [VA evt_Index_Char_INT01]+1
End While
//
VA evt_Index_BinNo6_INT01 = 1
While VA evt_Index_BinNo6_INT01 is less than or equal to VA evt_Count_BinNo6_INT01
// 取出 6 bits binary 數字 (重複 4 次)
VA evt_BinNo_Length6_CFSTR8 = substr([VA evt_BinNo_Length24_DSSP],0,
[VA evt_Length_BinNo6_INT01])
VA evt_BinNo_Length24_DSSP = substr([VA evt_BinNo_Length24_DSSP],
[VA evt_Length_BinNo6_INT01],24)
//
If VA evt_BinNo_Length6_CFSTR8 is not equal to <Blank>
And VA evt_BinNo_Length6_CFSTR8 is not equal to <Null>
// 將取出的 6 bits binary 數字轉回 10 進位數字
// (Convert From Binary Number To Decimal Number : B46R0210)
// 透過字元對照表取出對應加密字元
VA evt_BinNo_Length6_CFSTR8 = rpad([VA evt_BinNo_Length6_CFSTR8],"0",
[VA evt_Length_BinNo6_INT01])
Convert From Binary Number To Decimal Number
VA evt_Index_ConvertTable_MATH01 <- BF mnDecimalNumber
VA evt_BinNo_Length6_CFSTR8 -> BF szBinaryNumber
BF szOutputString = concat([BF szOutputString],
substr([VA evt_Table_Conversion_URL],[VA evt_Index_ConvertTable_MATH01],1))
Else
// 取不到 6 bits binary 數字時, 直接回傳 '=' 字元
BF szOutputString = concat([BF szOutputString],'=')
End If
//
VA evt_Index_BinNo6_INT01 = [VA evt_Index_BinNo6_INT01]+1
End While
End While
BF szOutputString = ""
VA evt_Count_Char_INT01 = 3
VA evt_Count_BinNo6_INT01 = 4
VA evt_Length_BinNo8_INT01 = 8
VA evt_Length_BinNo6_INT01 = 6
VA evt_Input_Temporary_URL = [BF szInputString]
VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
//
While VA evt_Length_Input_INT01 is greater than <Zero>
VA evt_Index_Char_INT01 = 1
VA evt_BinNo_Length24_DSSP = ""
While VA evt_Index_Char_INT01 is less than or equal to VA evt_Count_Char_INT01
And VA evt_Length_Input_INT01 is greater than <Zero>
// 取出 1 個字元 (重複 3 次)
VA evt_Char_FromInput_EV01 = substr([VA evt_Input_Temporary_URL],0,1)
VA evt_Input_Temporary_URL = substr([VA evt_Input_Temporary_URL],1,
[VA evt_Length_Input_INT01])
VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
//
// 將取出的字元轉為 ASCII
// (Character to Math Numeric, Convert : B0000049)
// 為什麼使用 B0000049 ? 因為我找不到可以直接將字轉為 ASCII 的 BF
// B0000049 是以'0'為起始, 所以要加上 48 轉為 ASCII (ASCII 表中'0'的 10 進位為 48)
Character to Math Numeric, Convert
VA evt_Char_FromInput_EV01 -> BF cCharacter
VA evt_ASCIINo_FromChar_MATH01 <- BF mnMathNumeric
VA evt_ASCIINo_FromChar_MATH01 = [VA evt_ASCIINo_FromChar_MATH01]+48
//
// 將 ASCII 轉為 2 進位 (Binary), 並補齊 8 bits (左側補'0')
// (Convert From Deciaml Number To Binary Number : B46R0210)
Convert From Deciaml Number To Binary Number
VA evt_ASCIINo_FromChar_MATH01 -> BF mnDecimalNumber
VA evt_BinNo_Length8_A801 <- BF szBinaryNumber
VA evt_BinNo_Length8_A801 = lpad([VA evt_BinNo_Length8_A801],"0",
[VA evt_Length_BinNo8_INT01])
//
// 將 binary 數字整理為 3 Bytes (24 bits)
VA evt_BinNo_Length24_DSSP = concat([VA evt_BinNo_Length24_DSSP],
[VA evt_BinNo_Length8_A801])
//
VA evt_Index_Char_INT01 = [VA evt_Index_Char_INT01]+1
End While
//
VA evt_Index_BinNo6_INT01 = 1
While VA evt_Index_BinNo6_INT01 is less than or equal to VA evt_Count_BinNo6_INT01
// 取出 6 bits binary 數字 (重複 4 次)
VA evt_BinNo_Length6_CFSTR8 = substr([VA evt_BinNo_Length24_DSSP],0,
[VA evt_Length_BinNo6_INT01])
VA evt_BinNo_Length24_DSSP = substr([VA evt_BinNo_Length24_DSSP],
[VA evt_Length_BinNo6_INT01],24)
//
If VA evt_BinNo_Length6_CFSTR8 is not equal to <Blank>
And VA evt_BinNo_Length6_CFSTR8 is not equal to <Null>
// 將取出的 6 bits binary 數字轉回 10 進位數字
// (Convert From Binary Number To Decimal Number : B46R0210)
// 透過字元對照表取出對應加密字元
VA evt_BinNo_Length6_CFSTR8 = rpad([VA evt_BinNo_Length6_CFSTR8],"0",
[VA evt_Length_BinNo6_INT01])
Convert From Binary Number To Decimal Number
VA evt_Index_ConvertTable_MATH01 <- BF mnDecimalNumber
VA evt_BinNo_Length6_CFSTR8 -> BF szBinaryNumber
BF szOutputString = concat([BF szOutputString],
substr([VA evt_Table_Conversion_URL],[VA evt_Index_ConvertTable_MATH01],1))
Else
// 取不到 6 bits binary 數字時, 直接回傳 '=' 字元
BF szOutputString = concat([BF szOutputString],'=')
End If
//
VA evt_Index_BinNo6_INT01 = [VA evt_Index_BinNo6_INT01]+1
End While
End While
當中遇到的陷阱是:B46R0210 有 Bug
真是有點懶得再寫 Decode...
此 function 只適用於單位元組 (single byte)處理
所以無法處理中文
但可以先將中文轉為 Url Encoding 的格式, 再進行 Base64 Encode
這樣 Decode 後的字串還是能被網頁識別為中文
(Url Encoding 轉換 : w3schools.com)
沒有留言:
張貼留言