base64工具小程序

·

bin下载: base64.zip

#include <Windows.h>
#include <stdio.h>

#pragma comment(lib,"Crypt32.lib")

BOOL EncodeBase64(const char* filename, BOOL Decode)
{
    BOOL	Result = FALSE;
    CHAR	NewFilePath[MAX_PATH];
    HANDLE	hOrigFile = INVALID_HANDLE_VALUE;
    HANDLE	hNewFile = INVALID_HANDLE_VALUE;
    DWORD	OrigFileSize;
    DWORD	NumberOfBytesRead;
    DWORD	NumberOfBytesWritten;
    PBYTE	OrigContent = NULL;
    PCHAR	NewContent = NULL;
    DWORD	NewLength = 0;
    
    do
    {
        hOrigFile = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
        if (hOrigFile == INVALID_HANDLE_VALUE)
            break;
        OrigFileSize = GetFileSize(hOrigFile, NULL);
        OrigContent = LocalAlloc(LPTR, OrigFileSize);
        if (OrigContent == NULL)
            break;
        if (ReadFile(hOrigFile, OrigContent, OrigFileSize, &NumberOfBytesRead, NULL) == FALSE)
            break;
        if (OrigFileSize != NumberOfBytesRead)
            break;
        lstrcpyA(NewFilePath, filename);
        if (Decode)
        {
            lstrcatA(NewFilePath, ".base64_decode");
            if (CryptStringToBinaryA((LPCSTR)OrigContent, OrigFileSize, CRYPT_STRING_BASE64, NULL, &NewLength, NULL, NULL) == FALSE || NewLength == 0)
                break;
            NewContent = LocalAlloc(LPTR, NewLength);
            if (NewContent == NULL)
                break;
            if (CryptStringToBinaryA((LPCSTR)OrigContent, OrigFileSize, CRYPT_STRING_BASE64, NewContent, &NewLength, NULL, NULL) == FALSE || NewLength == 0)
                break;
        }
        else
        {
            lstrcatA(NewFilePath, ".base64_encode");
            if (CryptBinaryToStringA((const BYTE*)OrigContent, OrigFileSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &NewLength) == FALSE)
                break;
            NewContent = LocalAlloc(LPTR, NewLength);
            if (NewContent == NULL)
                break;

            if (CryptBinaryToStringA((const BYTE*)OrigContent, OrigFileSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NewContent, &NewLength) == FALSE)
                break;
        }
        
        hNewFile = CreateFileA(NewFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
        if (hNewFile == INVALID_HANDLE_VALUE)
            break;
        if (WriteFile(hNewFile, NewContent, NewLength, &NumberOfBytesWritten, NULL) == FALSE)
            break;
        if (NewLength != NumberOfBytesWritten)
            break;
        Result = TRUE;
    } while (0);
    if (hOrigFile != INVALID_HANDLE_VALUE)
        CloseHandle(hOrigFile);
    if (hNewFile != INVALID_HANDLE_VALUE)
        CloseHandle(hNewFile);
    if (OrigContent)
        LocalFree(OrigContent);
    if (NewContent)
        LocalFree(NewContent);
    return Result;
}

BOOL Is64BitOS()
{
    typedef VOID(WINAPI* LPFN_GetNativeSystemInfo)(__out LPSYSTEM_INFO lpSystemInfo);
    LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetNativeSystemInfo");
    if (fnGetNativeSystemInfo)
    {
        SYSTEM_INFO stInfo = { 0 };
        fnGetNativeSystemInfo(&stInfo);
        if (stInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64
            || stInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
        {
            return TRUE;
        }
    }
    return FALSE;
}

int main(int argc, char* argv[])
{
    BOOL	Result = FALSE;
    PVOID	OldValue;
    BOOL	IsWow64;

    IsWow64 = Is64BitOS();
    if (IsWow64)
        Wow64DisableWow64FsRedirection(&OldValue);
    printf("base64.exe {encode|decode} {filepath}\n");
    if (argc != 3)
    {
        return -1;
    }
    if (lstrcmpiA(argv[1], "encode") == 0)
    {
        Result = EncodeBase64(argv[2], FALSE);
    }
    else if (lstrcmpiA(argv[1], "decode") == 0)
    {
        Result = EncodeBase64(argv[2], TRUE);
    }
    else
    {
        printf("Parameter error \n");
    }
    if (Result)
        printf("Encoding or decoding successful \n");
    else
        printf("Encoding or decoding failed\n");
    return 1;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注