Копирование std::wostringstream в Си строку(char)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Artist666, 28 Dec 2015.

  1. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Блин, уже всё облазил, нигде не нашел...

    Вот в этой строке, находится хэш sha1:
    Code:
    byte result[20];
    Мне нужно его отобразить в hex:
    Code:
    char Hex[41]; Byte2Hex(result, Hex);
    MessageBoxA(hWnd, Hex, "HEX", 0);
    Вот тут собственно и проблемы:
    Code:
    void Byte2Hex(byte bValue[], char lpBuff[])
    {
        std::wostringstream oss;
        for(int i = 0; i < 20; ++i) oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned>(bValue[i]);
        //std::copy(lpBuff, длина чего - то, bValue);
        strcpy(lpBuff, oss.str());
    }
    1. Я правильно указал?Скобки нужны? Может звездочку надо поставить? Byte2Hex(byte bValue[], char lpBuff[])

    2. как узнать длину byte bValue[]? А то i < 20...

    3. Как записать в char lpBuff[] с нуль терминатором в конце, строку oss?
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    1. Компилятор на этот вопрос молчит? Компилирует что угодно и ничего не подсказывает?
    2. Никак. Разве что передать ее в качестве аргумента.
    3. Следи за мыслью: ты берешь набор байт, зачем-то пишешь в stringstream, причем для юникодных символов, потом вызываешь strcpy (который кстати копирует до первого нулл-байта, х), что будет эквивалентом 1 символа т.к. UTF-16, далее ты это хочешь вывести через месаджбокс, который ANSI (не юникодный, не UTF16).

    Внимание вопрос: зачем тут вообще С++? если нужен С++, то зачем работа с сишными функциями?
     
    _________________________
    Ins3t and Artist666 like this.
  3. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Разобрался почти, 1 ошибка, не могу найти как её убрать, вернее не знаю.
    Понимаю что разные операнды, а какие нужно х.з...
    Помогите, уже 4 дня торчу на этом моменте...

    В 19 строке: iss >> std::hex

    Code:
    #include <windows.h>
    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    void Byte2HexW(byte bValue[], size_t bSize, wchar_t * lpBuff) // В двухбайтовую строку
    {
        std::wostringstream oss;
        for (int i = 0; i < bSize; ++i) oss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<unsigned>(bValue[i]);
        wcscpy(lpBuff, oss.str().c_str());
    }
    void HexW2Byte(wchar_t lpBuff[], byte bValue[]) // Из двухбайтовой строки
    {
        unsigned n;
        std::wstring s = lpBuff;
        for(size_t i = 0, j = 0; i < s.length(); i += 2, ++j)
        {
            std::wostringstream iss(s.substr(i, 2));
            iss >> std::hex >> n;
            bValue[j] = n;
        }
    }
    
    int main(int argc, char ** argv)
    {
        setlocale(LC_ALL, "Russian");
    
        byte result[72] = // Это какая - то строка...
        {
            0xd0, 0xa2, 0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x81, 0xd1, 0x82, 0x20, 0xd0, 0xbf, 0xd1, 0x80, 0xd0,
            0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb9, 0x2c, 0x20, 0x65, 0x6e, 0x67, 0x6c, 0x69,
            0x73, 0x68, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x2c, 0x20, 0xe4, 0xba, 0x8b, 0xe5, 0xa5,
            0x89, 0xe8, 0x81, 0x96, 0xe7, 0xa6, 0xae, 0xe9, 0x87, 0x8b, 0x20, 0x2d, 0x20, 0xd0, 0xba, 0xd0,
            0xbe, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x86, 0x2e
        };
        wchar_t wHex[72 * 2 + 1]; Byte2HexW(result, 72, wHex); // В однобайтовую строку из byte
        byte bValue[72]; HexW2Byte(wHex, bValue); // Из однобайтовой строки в byte
    
        std::wcout << "Это многобайтовая строка hex : " << wHex << std::endl << "Это вообще не строка, byte : " << bValue << std::endl;
    
        system("pause");
    }
     
  4. neviens

    neviens Member

    Joined:
    9 Oct 2013
    Messages:
    82
    Likes Received:
    28
    Reputations:
    3
    Code:
    #include <iostream>
    #include <iomanip>
    #include <sstream>
    using namespace std;
    
    string bin2hex(unsigned char* buf, int len)
    {
       stringstream ss;
    
       for(int i = 0; i < len; ++i)
         ss << hex << setfill('0') << setw(2) << (int)buf[i];
    
       return ss.str();
    }
    
    int main()
    {
       unsigned char buf[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    
       cout << bin2hex(buf, sizeof(buf)) << endl;
       return 0;
    }
    
    
     
    Artist666 likes this.