0

我有一个文本包含一个十六进制字节,如下所示:

01 1b 42 61 6b 68 73 68 5f 48 6f 73 70 69 74 61 6c 5f 41 6c 2d 53 68 61 72 61 66 69 61 02 0f 33 30 30 31 37 34 37 36 39 35 31 30 30 30 33 03 10 30 32 2f 30 31 2f 31 37 5f 30 35 3a 31 32 5f 50 04 05 31 34 2e 30 30 05 01 30

,当我使用 powerbuilder winsock 用户对象中的 of_encode64() 函数将其加密为 BASE64 时,我得到以下结果:

MDExQjQyNjE2QjY4NzM2ODVGNDg2RjczNzA2OTc0NjE2QzVGNDE2QzJENTM2ODYx NzI2MTY2Njk2MTAyMEYzMzMwMzAzMTM3MzQzNzM2MzkzNTMxMzAzMDMwMzMwMzEw MzAzMjJGMzAzMTJGMzEzNzVGMzAzNTNBMzEzMjVGNTAwNDA1MzEzNDJFMzAzMDA1 MDEzMA==

,但是当我的朋友在 Dot Net 中使用 Convert.ToBase64String() 对其进行编码时,他得到了完全不同的结果,如下所示:

ARtCYWtoc2hfSG9zcGl0YWxfQWwtU2hhcmFmaWECDzMwMDE3NDc2OTUxMDAwMwMQMDIvMDEvMTdfMDU6MTJfUAQFMTQuMDAFATA=,我使用了所有可能的参数:CRYPT_STRING_BASE64HEADER、CRYPT_STRING_BASE64HEADER、CRYPT_STRING_BASE64REQUESTHEADER、CRYPT_STRING_BASE64X509,但没有帮助!

of_encode64() 函数代码如下:

[local function declaration]
Function boolean CryptBinaryToString ( &
    Blob pbBinary, &
    ulong cbBinary, &
    ulong dwFlags, &
    Ref string pszString, &
    Ref ulong pcchString &
    ) Library "crypt32.dll" Alias For "CryptBinaryToStringW"
[instance variables]
// Base64, with certificate beginning and ending headers
CONSTANT Ulong CRYPT_STRING_BASE64HEADER = 0

// Base64, without headers
CONSTANT Ulong CRYPT_STRING_BASE64 = 1

// Base64, with request beginning and ending headers
CONSTANT Ulong CRYPT_STRING_BASE64REQUESTHEADER = 3

// Base64, with X.509 CRL beginning and ending headers
CONSTANT Ulong CRYPT_STRING_BASE64X509CRLHEADER = 9

将字符串编码为 Base64:

// -----------------------------------------------------------------------------
// SCRIPT:     n_winsock.of_Encode64
//
// PURPOSE:    This function converts binary data to a Base64 encoded string.
//
//                  Note: Requires Windows XP or Server 2003
//
// ARGUMENTS:  ablob_data - Blob containing data
//
// RETURN:     String containing encoded data
//
// DATE        PROG/ID      DESCRIPTION OF CHANGE / REASON
// ----------  --------     -----------------------------------------------------
// 08/20/2010   RolandS     Initial coding
// 09/27/2010   RolandS     Changed to remove trailing CRLF characters
// 03/17/2012   RolandS     Changed argument to read-only
// -----------------------------------------------------------------------------

String ls_encoded
ULong lul_len, lul_buflen
Boolean lb_rtn

lul_len = Len(ablob_data)

lul_buflen = lul_len * 3
//lul_buflen = lul_len * 2

ls_encoded = Space(lul_buflen)

lb_rtn = CryptBinaryToString(ablob_data, lul_len, &
                    CRYPT_STRING_BASE64, ls_encoded, lul_buflen)
If lb_rtn Then
    ls_encoded = Left(ls_encoded, lul_buflen - 2)
Else
    SetNull(ls_encoded)
End If

Return ls_encoded

我使用以下代码调用它:其中 as_data 是上面的十六进制字节字符串

Return of_Encode64(Blob(as_data, EncodingAnsi!))

使用以下 URL 中的 winsock 用户对象在 PowerBuilder 中对 Base64 中的字符串进行编码/解码的完整代码: https ://www.rgagnon.com/pbdetails/pb-0258.html

先感谢您。注意安全。

4

0 回答 0