Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
1

Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll

16.08.2013, 01:08. Показов 4254. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, написать за меня:
1) преобразование аргумента ком. строки -> в Unicode (какой не знаю): пытаюсь перевести код, данный в статье: http://www.remkoweijnen.nl/blo... encrypted/

Нужно подставить в строки №№ 32, 57.

Наработки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#pragma comment(lib, "crypt32.lib")
 
#include <windows.h>
#include <stdio.h>  // printf
#include <stdlib.h> // system
#include <Wincrypt.h>
 
//#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
 
void MyHandleError(char *s);
 
/*
typedef int (__cdecl *pCryptProtectData)(
            DATA_BLOB *pDataIn,
            LPCWSTR szDataDescr,
            DATA_BLOB *pOptionalEntropy,
            PVOID pvReserved,
            CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
            DWORD dwFlags,
            DATA_BLOB *pDataOut);
 */
 
int main(int argc, char *argv[])
{
    //if (argc < 2) exit(0); //using();
 
    // Declare and initialize variables.
 
    DATA_BLOB DataIn;
    DATA_BLOB DataOut;
    DATA_BLOB DataVerify;
    BYTE *pbDataInput =(BYTE*)"secret"; //  <---- Need UNICODE. Here we trying to encrypt the word "secret"
    //BYTE *pbDataInput =(BYTE*)argv[1];
    DWORD cbDataInput = strlen((char*)pbDataInput)+1;
    DataIn.pbData = pbDataInput;
    DataIn.cbData = cbDataInput;
    LPWSTR pDescrOut = NULL;
 
    //  Begin processing.
 
    printf("The data to be encrypted is: %s\n", pbDataInput);
 
    // Get a handle to the DLL module
 
    /*
    if (HINSTANCE hinstLib = LoadLibrary(TEXT("crypt32.dll")))
    {
        // If the handle is valid, try to get the function address.
 
        if (pCryptProtectData CryptProtectData = (pCryptProtectData) GetProcAddress(hinstLib, "CryptProtectData"))
        {
        */
            // If the function address is valid, call the function
 
            if(CryptProtectData(
                &DataIn,
                L"psw",                             // <---- Need UNICODE also. RDP always sets description to "psw"
                NULL,                               // Optional entropy - not used.
                NULL,                               // Reserved.
                NULL,                               // Pass a PromptStruct.
                CRYPTPROTECT_UI_FORBIDDEN,          // Without user prompt.
                &DataOut))
            {
                // --> DATA_BLOB to HEX string
 
                for (int i = 0; i < (int)DataOut.cbData; i ++)
                {
                    printf("%02X", DataOut.pbData[i]);
                }
            }
            else
            {
                MyHandleError("Encryption error!");
            }
 
            if (CryptUnprotectData(
                &DataOut,
                &pDescrOut,
                NULL,                         // Optional entropy
                NULL,                         // Reserved
                NULL,                         // Optional PromptStruct
                0,
                &DataVerify))
            {
                printf("The decrypted data is: %s\n", DataVerify.pbData);
                printf("The description of the data was: %S\n",pDescrOut);
            }
            else
            {
                MyHandleError("Decryption error!");
            }
 
            //  Clean up.
 
            LocalFree(pDescrOut);
            LocalFree(DataOut.pbData);
 
            /*
        }
 
        // Free the DLL module
 
        BOOL fFreeResult = FreeLibrary(hinstLib);
    }
    */
 
    system("pause");
    return 0;
}
 
void MyHandleError(char *s)
{
    fprintf(stderr,"ERROR: %s\n",s);
    fprintf(stderr, "Error number %x.\n", GetLastError());
    system("pause");
    exit(1);
}


На MSDN и у большого Гугла нашел пару функций,
но не хватает мозгов, как правильно выделить буфер получателя исходя из динамической размерности исходного массива char.

Сами функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool AsciiToUnicode(const char* szAscii, wchar_t* szUnicode)
{
    if ((szUnicode == NULL) || (szAscii == NULL))
        return false;
    int len = strlen(szAscii);
    for (int i = 0; i < (len + 1); i ++)
        *szUnicode++ = static_cast<wchar_t> (*szAscii ++);
    return true;
}
 
BOOL AnsiToUnicode16(CHAR *in_Src, WCHAR *out_Dst, INT in_MaxLen)
{
    /* locals */
    INT lv_Len;
 
  // do NOT decrease maxlen for the eos
  if (in_MaxLen <= 0)
    return FALSE;
 
  // let windows find out the meaning of ansi
  // - the SrcLen=-1 triggers MBTWC to add a eos to Dst and fails if MaxLen is too small.
  // - if SrcLen is specified then no eos is added
  // - if (SrcLen+1) is specified then the eos IS added
  lv_Len = MultiByteToWideChar(CP_ACP, 0, in_Src, -1, out_Dst, in_MaxLen);
 
  // validate
  if (lv_Len < 0)
    lv_Len = 0;
 
  // ensure eos, watch out for a full buffersize
  // - if the buffer is full without an eos then clear the output like MBTWC does
  //   in case of too small outputbuffer
  // - unfortunately there is no way to let MBTWC return shortened strings,
  //   if the outputbuffer is too small then it fails completely
  if (lv_Len < in_MaxLen)
    out_Dst[lv_Len] = 0;
  else if (out_Dst[in_MaxLen-1])
    out_Dst[0] = 0;
 
  // done
  return TRUE;
}


Попутные вопросы оффтопом:

2) При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно?
Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll

3) В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это?
4) В примере кода MSDN тип кодировки задается строкой:
C++
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Но как она влияет на API функцию? Это изменение переменной окружения, которую функция потом считывает при вызове?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2013, 01:08
Ответы с готовыми решениями:

Преобразовать WCHAR в CHAR в dll
Все нет сил... а точнее знаний... В MS Visual Studio 2010 создал dll (проект ATL)... она должна...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR?
Вроде давно занимаюсь программированием на С++, но встала проблема... Есть некий массив переменных...

Какой функцией можно преобразовать тип byte в тип string и наоборот?
Вот моя проблема, у меня конченое действие будет выводить число в 10 С.С и в типе byte, а мне надо...

17
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.08.2013, 01:12 2
а cmd.exe умеет юникод?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 13:44  [ТС] 3
На вход - обычная строка (CP 866). Далее argv[1] -> Unicode -> BYTE -> кодирование через CryptProtectData. Получаем BYTE -> Hex строка на выход.

Я так понял.

Добавлено через 7 минут
Код из статьи
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function CryptRDPPassword(sPassword: string): string; 
var DataIn: DATA_BLOB; 
    DataOut: DATA_BLOB; 
    pwDescription: PWideChar; 
    PwdHash: string; 
begin 
  PwdHash := '';                                      
 
  DataOut.cbData := 0; 
  DataOut.pbData := nil;                                      
 
  // RDP uses UniCode 
  DataIn.pbData := Pointer(WideString(sPassword)); 
  DataIn.cbData := Length(sPassword) * SizeOf(WChar);                                      
 
  // RDP always sets description to psw 
  pwDescription := WideString('psw');                                      
 
  if CryptProtectData(@DataIn, 
                      pwDescription, 
                      nil, 
                      nil, 
                      nil, 
                      CRYPTPROTECT_UI_FORBIDDEN,  // Never show interface 
                      @DataOut) then 
  begin 
    PwdHash := BlobDataToHexStr(DataOut.pbData, DataOut.cbData); 
  end; 
  Result := PwdHash;                                      
 
  // Cleanup 
  LocalFree(Cardinal(DataOut.pbData)); 
  LocalFree(Cardinal(DataIn.pbData));                                      
 
end;


Цитата Сообщение от Dragokas Посмотреть сообщение
Unicode -> BYTE
Delphi
DataIn.pbData := Pointer(WideString(sPassword));
или так: *Unicode

Вообщем совершенно запутался.

Добавлено через 12 часов 21 минуту
Актуально.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.08.2013, 14:06 4
Можно так сделать: получить юникодную командную строку через GetCommandLineW,
затем распарсить ее при помощи CommandLineToArgvW, а затем первый аргумент
подать на вход функции CryptProtectData. И не нужно ничего конвертировать.
1
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
16.08.2013, 14:06 5
Хм, ну если нет встроенных функций, можно написать что-то свое.
Долгий путь - писать структуры с чарсетами разных кодировок, по ним же явным образом преобразовывать в байты.
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 14:28  [ТС] 6
FraidZZ, зачем. Я ведь уже выложил в теме 2 функции.
Я хочу только, чтобы Вы показали как ними пользоваться. Я плохо в этом разбираюсь.
Цитата Сообщение от Dragokas Посмотреть сообщение
как правильно выделить буфер получателя исходя из динамической размерности исходного массива char.
Добавлено через 38 секунд
Убежденный, спасибо. Потом попробую.
0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
16.08.2013, 14:33 7
Цитата Сообщение от Dragokas Посмотреть сообщение
C++
1
BYTE *pbDataInput =(BYTE*)"secret";
Тут ты преобразуешь указатель на const char в указатель на BYTE (я про твой код). Не знал, что оно будет работать 0_0. Или же я не прав. По-моему, нужно все-таки юзать какие-то функции преобразования wchar->BYTE. Но я не помню, какие, а справочника под рукой нет(
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 14:35  [ТС] 8
FraidZZ, судя из того, что выдает DataVerify.pbData на выходе, это работает верно.

Можешь раскомментировать //BYTE *pbDataInput =(BYTE*)argv[1]; и проверить.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.08.2013, 14:51 9
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dragokas Посмотреть сообщение
При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно?
Объявить функцию CryptProtectData как _stdcall, а не _cdecl.

Цитата Сообщение от Dragokas Посмотреть сообщение
В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это?
Unicode. Конкретно - UTF-16 Little Endian.
Windows давно уже юникодная "внутри", а UTF-16 LE - родная для нее кодировка.

Цитата Сообщение от Dragokas Посмотреть сообщение
В примере кода MSDN тип кодировки задается строкой:
C++
1
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Но как она влияет на API функцию?
Никак. Эта строка в примере лишняя (видимо, перекочевала туда из другого примера).

Добавлено через 2 минуты
В общем, должно получиться нечто подобное:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
 
 
 
#include <iostream>
#include <string>
#include <Windows.h>
 
#include <WinCrypt.h>
#pragma comment(lib, "Crypt32.lib")
 
#include <strsafe.h>
 
 
 
namespace
{
 
 
 
void
_stdcall
throw_exc(char const *pFormat, ...)
{
    using namespace std;
 
    va_list VaList;
    va_start(VaList, pFormat);
 
    size_t const BuffSize = 1000;
    char *pBuffer = new char[BuffSize];
    string ErrMsg;
 
    if (FAILED(StringCchVPrintfA(pBuffer, BuffSize, pFormat, VaList)))
    {
        ErrMsg = pFormat;
    }
 
    else
    {
        ErrMsg = pBuffer;
    }
 
    delete [] pBuffer;
    throw (runtime_error(ErrMsg.c_str()));
}
 
 
 
} // namespace
 
 
 
int main()
{
    using namespace std;
 
    try
    {
        wchar_t *pCmdLine = GetCommandLineW();
 
        if (NULL == pCmdLine)
        {
            throw_exc("GetCommandLineW failed with last error %lu.", GetLastError());
        }
 
        int NumArgs;
        wchar_t **pArgsArray = CommandLineToArgvW(pCmdLine, &NumArgs);
 
        if (NULL == pArgsArray)
        {
            throw_exc("CommandLineToArgvW failed with last error %lu.", GetLastError());
        }
 
        if (2 != NumArgs)
        {
            LocalFree(pArgsArray);
            throw_exc("Wrong arguments number (%lu).", NumArgs);
        }
 
        wstring const Password = pArgsArray[1];
        LocalFree(pArgsArray);
 
        DATA_BLOB BlobIn;
        DATA_BLOB BlobOut;
        BlobIn.pbData = (BYTE *)Password.c_str();
        BlobIn.cbData = static_cast<DWORD>((Password.length() + 1) * sizeof (wchar_t));
 
        if (FALSE == CryptProtectData(&BlobIn,
            L"psw",
            NULL,
            NULL,
            NULL,
            CRYPTPROTECT_UI_FORBIDDEN,
            &BlobOut))
        {
            throw_exc("CryptProtectData failed with last error %lu.", GetLastError());
        }
 
        for (DWORD i = 0; i < BlobOut.cbData; ++i)
        {
            printf("%02X", BlobOut.pbData[i]);
        }
 
        printf("\r\n");
 
        LocalFree(BlobOut.pbData);
    }
 
    catch (exception const &Exc)
    {
        cerr << "ERROR: " << Exc.what() << endl;
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 15:37  [ТС] 10
Убежденный, что-то здесь не так.
Программа всегда возвращает разный 16-ричный вывод для одной и той же фразы.
В моем коде (без юникода) она выдавала всегда одинаковый.

По коду спасибо. Справедливые, поучительные правки.
Можно несколько вопросов?

Цитата Сообщение от Убежденный Посмотреть сообщение
C++
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
1) Эти макроопределения на что влияют? Не вижу, чтобы они напрямую использовались.

C++
throw_exc(char const *pFormat, ...)
2) Что означает "..." ?

3) L"psw" - это Unicode? Если нет, то как будет?

Добавлено через 12 минут
Ох, извините, у меня тоже вывод был разный.
Спасибо за пример с юникодом.
С шифрованием позже поразбираюсь.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.08.2013, 15:47 11
Цитата Сообщение от Dragokas Посмотреть сообщение
Убежденный, что-то здесь не так.
Программа всегда возвращает разный 16-ричный вывод для одной и той же фразы.
Так и должно быть. CryptProtectData использует "соль" для шифрования, чтобы усложнить взлом.
Попробуйте добавить CryptUnprotectData - обратное преобразование будет выполнено без ошибок.

Цитата Сообщение от Dragokas Посмотреть сообщение
1) Эти макроопределения на что влияют? Не вижу, чтобы они напрямую использовались.
Это определение целевой версии (в данном случае WinXP, она же NT 5.1).
Можно сказать, что это защита от подключения объявлений функций, которые
появились в более поздних версиях.

Цитата Сообщение от Dragokas Посмотреть сообщение
2) Что означает "..." ?
Функция принимает переменное число аргументов.

Цитата Сообщение от Dragokas Посмотреть сообщение
3) L"psw" - это Unicode? Если нет, то как будет?
Будет так: "psw". Но CryptProtect(Unprotect)Data работают только с юникодом,
другую строку им не подсунуть.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 17:14 12
Я не совсем понимаю, а зачем в 32-й строке нужна именно Unicode-строка ? CryptProtectData этого не требует.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.08.2013, 17:24 13
castaway, посмотрите код по ссылке, которую давал Dragokas.
Там есть такой фрагмент:
Delphi
1
2
3
// RDP uses UniCode
DataIn.pbData := Pointer(WideString(sPassword));
DataIn.cbData := Length(sPassword) * SizeOf(WChar);
Добавлено через 1 минуту
Кстати, в мой код нужно внести поправку, чтобы не учитывался завершающий ноль.
То есть, вместо:
C++
1
BlobIn.cbData = static_cast<DWORD>((Password.length() + 1) * sizeof (wchar_t));
сделать так:
C++
1
BlobIn.cbData = static_cast<DWORD>(Password.length() * sizeof (wchar_t));
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 17:47 14
Как вариант.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <wincrypt.h>
#include <cstdio>
#include <cstdlib>
 
int main( int argc, char *argv[] )
{
    if ( argc != 2 ) return 1;
 
    DATA_BLOB DataIn;
    DATA_BLOB DataOut;
    wchar_t secret[256];
    DataIn.cbData = mbstowcs( secret, argv[1], 256 ) * sizeof( wchar_t );
    DataIn.pbData = (BYTE *)(&secret[0]);
    if ( CryptProtectData( &DataIn, L"psw", NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &DataOut ) ) {
        for ( size_t i = 0; i < DataOut.cbData; i++ ) {
            fprintf( stderr, "%02x", DataOut.pbData[i] );
        }
    } else {
        printf( "CryptProtectData(): error\n" );
    }
    return 0;
}
2
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 17:52  [ТС] 15
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, в мой код нужно внести поправку, чтобы не учитывался завершающий ноль.
C++
1
BlobIn.pbData = (BYTE *)Password.c_str();
а здесь NULL обязателен? (метод c_str() его добавляет на сколько я понял)
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.08.2013, 17:56 16

Не по теме:


Цитата Сообщение от castaway Посмотреть сообщение
Как вариант
...
Краткость - С.Т. Вот чего мне всегда не хватало.
Хотя не могу спокойно смотреть на код, где нет дотошной
обработки каждой возможной ошибки.



Добавлено через 1 минуту
Цитата Сообщение от Dragokas Посмотреть сообщение
а здесь NULL обязателен? (метод c_str() его добавляет на сколько я понял)
Добавляет.
Но в коде по ссылке, которую Вы давали в исходном сообщении, этот ноль не учитывается.

Добавлено через 47 секунд
Т.е. длина "secret" принимается равной 6 символов * 2 байта на символ = 12 байт.
0
castaway
16.08.2013, 17:57
  #17

Не по теме:

Убежденный, ошибок тут может быть ровно две.
1. недостаточный размер secret (обработать не составит труда)
2. ошибка возвращаемая функцией CryptProtectData (обработана)

0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.08.2013, 18:18  [ТС] 18
mbstowcs Return Value
The number of wide characters written to dest, not including the eventual terminating null character.
castaway, спасибо. Как раз длину результирующего значения я и не знал откуда взять.

Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Т.е. длина "secret" принимается равной 6 символов * 2 байта на символ = 12 байт.
Понял. Т.е. можно было и самому сосчитать.

Цитата Сообщение от Убежденный Посмотреть сообщение
Добавляет.
Но в коде по ссылке, которую Вы давали в исходном сообщении, этот ноль не учитывается.
Ясно. Попробовал без c_str(). wide string -> BYTE напрямую не умеет. Теперь понятно зачем это.
0
16.08.2013, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2013, 18:18
Помогаю со студенческими работами здесь

Тип byte и char
Чем отличает тип данных byte от типа данных char? А чем тип Integer от int?

Почему byte можно преобразовать явно в char?
Почему byte можно преобразовать явно в char?

Преобразовать тип byte в short
Привет. Скажите пожалуйста. Здесь я нашел таблицу явных числовых преобразований...

Нельзя преобразовать тип set of char к char
Вот такой код работает замечательно. program prog; var c: char; begin readln(c); case c...

Как преобразовать тип byte[] в string
пытался преобразовать string x = Convert.ToString(data);

Не удаётся неявно преобразовать тип string в byte[]
Добрый вечер. &quot;Позаимствовал&quot; код блочного шифра на C# для своей курсовой, оригинальный код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru