zoukankan      html  css  js  c++  java
  • C++ string

    C++ string best practices => LPTSTR, PSTR, CString, _T, TEXT, Win32 API, Win16. string, wstring.

    strings

    http://msdn.microsoft.com/en-us/library/ms174288.aspx

    LPTSTR

    http://baike.baidu.com/view/3186101.htm 

    Using CString       very  useful

    http://msdn.microsoft.com/en-us/library/ms174288.aspx

    CryptStringToBinary <=> CryptBinaryToString

    // CString_example_1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <string>
    #include <wincrypt.h>
    #include <iostream>     // std::cout, std::end
    
    
    
    #pragma comment(lib, "crypt32.lib")
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        // Chinese characters for "zhongwen" ("Chinese language").
        const BYTE kChineseSampleText[] = { -28, -72, -83, -26, -106, -121, 0 };
        //-28 => 1110,0100 => 228
        //-72 => 1011,1000 => 184
        //-83 => 1010,1101 => 173
        //-26 => 1110,0110 => 230
        //-106 => 1001,0110 => 150
        //-121 => 1000,0111 => 135
    
        //const char kChineseSampleText[] = "xe4xb8xadxe6x96x87";
        //const char kChineseSampleText[] = "e48ade69687";
    
        DWORD strLen = 0;
        CryptBinaryToString(kChineseSampleText, 6,
            CRYPT_STRING_HEXRAW,
            NULL,
            &strLen
            );
    
        LPTSTR string1 = new TCHAR[strLen + 1];
    
    
        CryptBinaryToString(kChineseSampleText, 6,
            CRYPT_STRING_HEXRAW,
            string1,
            &strLen
            );
    
        string1[strLen] = '';
        LPCTSTR stringC = string1;
    
        //string strii = 
    
        wprintf(string1, "%s");
    
    
        //string to bytes
    
        DWORD strCLen = 0;
    
        CryptStringToBinary(
            stringC,
            strLen,
            CRYPT_STRING_HEXRAW,
            NULL,
            &strCLen,
            0,
            0
            );
    
    
        BYTE* cwStr = new BYTE[strCLen + 1];
    
        CryptStringToBinary(
            stringC,
            strLen,
            CRYPT_STRING_HEXRAW,
            cwStr,
            &strCLen,
            0,
            0
            );
    
        for (int i = 0; i < 6; i++)
        {
            BYTE x = cwStr[i];
            x++;
        }
    
        return 0;
    }
    View Code

     Wstring -> bytes -> base64 -> bytes -> Wstring Example

    // CString_example_1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <string>
    #include <wincrypt.h>
    #include <iostream>     // std::cout, std::end
    
    
    
    #pragma comment(lib, "crypt32.lib")
    
    void WstringToBytes(LPWSTR wszString, char* szAnsi, DWORD* bytesSize)
    {
        *bytesSize = WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, NULL, 0, NULL, FALSE);
    
        WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, szAnsi, *bytesSize, NULL, FALSE);
    }
    
    void BytesToWstring(char* bytes, LPWSTR wszString)
    {
        DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, bytes, -1, NULL, 0);
    
        MultiByteToWideChar(CP_UTF8, 0, bytes, -1, wszString, dwNum);
    
        //×îºó¼ÓÉÏ''
        wszString[dwNum] = '';
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        // Chinese characters for "zhongwen" ("Chinese language").
        //const BYTE kChineseSampleText[] = { -28, -72, -83, -26, -106, -121, 0 };
        //-28 => 1110,0100 => 228
        //-72 => 1011,1000 => 184
        //-83 => 1010,1101 => 173
        //-26 => 1110,0110 => 230
        //-106 => 1001,0110 => 150
        //-121 => 1000,0111 => 135
    
        //const char kChineseSampleText[] = "xe4xb8xadxe6x96x87";
        //const char kChineseSampleText[] = "e48ade69687";
    
        LPWSTR plainText = L"abcd1234";
        DWORD bytesLen = 6;
        char* buffer = new char[100];
    
    
        WstringToBytes(plainText, buffer, &bytesLen);
    
        BYTE* kChineseSampleText = new BYTE[bytesLen + 1];
        memcpy(kChineseSampleText, buffer, bytesLen);
    
    
        DWORD strLen = 0;
        CryptBinaryToString(kChineseSampleText, bytesLen,
            CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
            NULL,
            &strLen
            );
    
        LPTSTR string1 = new TCHAR[strLen + 1];
    
    
        CryptBinaryToString(kChineseSampleText, bytesLen,
            CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
            string1,
            &strLen
            );
    
        string1[strLen] = '';
        LPCTSTR stringC = string1;
    
        //string strii = 
    
        wprintf(string1, "%s");
    
    
        //string to bytes
    
        DWORD strCLen = 0;
    
        CryptStringToBinary(
            stringC,
            strLen,
            CRYPT_STRING_BASE64,
            NULL,
            &strCLen,
            0,
            0
            );
    
    
        BYTE* cwStr = new BYTE[strCLen + 1];
    
        CryptStringToBinary(
            stringC,
            strLen,
            CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
            cwStr,
            &strCLen,
            0,
            0
            );
    
        cwStr[strCLen] = '';
        /*for (int i = 0; i < 6; i++)
        {
            BYTE x = cwStr[i];
            x++;
        }*/
    
        LPWSTR result = (LPWSTR)malloc(1000);
        BytesToWstring((char*)cwStr, result);
    
    
        return 0;
    }
    View Code

    Example

    UTF16 to UTF8 to UTF16 simple CString based conversion

    http://www.codeproject.com/Articles/26134/UTF-to-UTF-to-UTF-simple-CString-based-conver

    wstring => char*

    char* = > wstring

    int _tmain(int argc, _TCHAR* argv[])
    {
        /*char sText[20] = { "多字节字符串!OK!" };  //bug; it is bytes
    
        DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, sText, -1, NULL, 0);
    
        wchar_t* pwText;
        pwText = new wchar_t[dwNum];
    
        MultiByteToWideChar(CP_UTF8, 0, sText, -1, pwText, dwNum);*/
    
        wchar_t wText[20] = { L"宽字符转换实例!OK!" };
    
        DWORD dwNum2 = WideCharToMultiByte(CP_UTF8, NULL, wText, -1, NULL, 0, NULL, FALSE);
        char* psText;
        psText = new char[dwNum2];
    
        WideCharToMultiByte(CP_UTF8, NULL, wText, -1, psText, dwNum2, NULL, FALSE);
    
    
        DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, psText, -1, NULL, 0);
    
        wchar_t* pwText;
        pwText = new wchar_t[dwNum];
    
        MultiByteToWideChar(CP_UTF8, 0, psText, -1, pwText, dwNum);
    
    
    
    
    
        return 0;
    }
    View Code

    CString is an ATL/MFC class (actually, a specialization of the CStringT class template). Because ATL and MFC are Windows specific, the class is also inherently Windows specific. ATL and MFC are not included with VC++ Express, so if you don't have VC++ Professional or better, using this isn't an option for you.

    If you want a string class that is platform agnostic, use std::string or std::wstring (which are specializations of the std::basic_string class template) instead, as these are part of the C++ standard library.

      http://social.msdn.microsoft.com/Forums/zh-CN/660029ba-994a-4f85-871b-2e5ae7b9c95b/cstring-help-in-regular-c?forum=vcgeneral

    But, if you are going to write Win32 C++ code, I think CString's interface is more convenient (...but maybe someone would say it is more "bloated" ;)

    For example: with CString you have methods to load strings from the resources.

    Moreover, CString offers a convenient FormatMessage method, which is good for internationalization, see the so called problem of "Yoda speak" on Mihai Nita's blog post here:

    http://mihai-nita.net/2006/04/15/string-api-and-internationalization/

    And CString assumes that strings are NUL-terminated (which is good for interoperability with Win32 functions like say GetWindowText), instead std::[w]string doesn't.

    And CString offers an implicit conversion operator LPCTSTR, so you can simply pass CString's to Win32 APIs having LPCTSTR parameters.

    Moreover, if you are using a pre-VC10 compiler which does not support move semantics, I think storing CString in STL containers and passing them around is faster than std::[w]string, because CString uses COW (Copy-On-Write) technique, so it avoids useless copies (e.g. when a vector is resized because its capacity is insufficient). (However, I think this problem is solved in VC10 thanks to move semantics applied to std::[w]string.)

        

    C++:在非MFC程序中如何引用CString?

    http://blog.csdn.net/xiashengfu/article/details/7911086

  • 相关阅读:
    CSS Sprite
    使用float和display:block将内联元素转换成块元素的不同点
    [POJ 1185] 炮兵阵地
    [POJ 1947] Rebuilding Roads
    [HDU 1561] The more, The Better
    [HDU 1011] Starship Troopers
    [POJ 1155] TELE
    [HDU 2196] Computer
    [HDU 1520] Anniversary party
    [HDU 5029] Relief grain
  • 原文地址:https://www.cnblogs.com/kevinygq/p/3980064.html
Copyright © 2011-2022 走看看