string s = "876c0e09-70f7-4190-ab3a-254b6e5f461e";
byte[] data = Encoding.Unicode.GetBytes(s);
byte[] hash = new MD5CryptoServiceProvider().ComputeHash(data);
StringBuilder sb = new StringBuilder();
foreach (var b in hash)
{
sb.Append(b.ToString("x2"));
}
string outVAR = sb.ToString();
Console.WriteLine(outVAR);
string ToBytes(const wstring& str) {
const char* d = reinterpret_cast<const char*>(&str[0]);
string result(d, d+str.size()*2);
return result;
}
int main() {
wstring data = L"876c0e09-70f7-4190-ab3a-254b6e5f461e"; // на винде это будет UTF-16 строка, как и в C#
cout << md5(ToBytes(data)) << endl;
system("pause");
}
d1206f6bcf6d9b31860482123c288650
std::string WinMD5(const void * data, const size_t data_size)
{
HCRYPTPROV hProv = NULL;
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
return std::string();
}
HCRYPTPROV hHash = NULL;
BOOL hash_ok = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
if (!hash_ok) {
CryptReleaseContext(hProv, 0);
return std::string();
}
if (!CryptHashData(hHash, static_cast<const BYTE *>(data), static_cast<DWORD>(data_size), 0)) {
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return std::string();
}
DWORD cbHashSize = 0, dwCount = sizeof(DWORD);
if (!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE *)&cbHashSize, &dwCount, 0)) {
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return std::string();
}
std::vector<BYTE> buffer(cbHashSize);
if (!CryptGetHashParam(hHash, HP_HASHVAL, reinterpret_cast<BYTE*>(&buffer[0]), &cbHashSize, 0)) {
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return std::string();
}
std::ostringstream oss;
for (auto item: buffer) {
oss << static_cast<unsigned int>(item);
}
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
return oss.str();
}
string ToBytes(const wstring& str) {
const char* d = reinterpret_cast<const char*>(&str[0]);
string result(d, d+str.size()*2);
return result;
}
int main() {
wstring data = L"876c0e09-70f7-4190-ab3a-254b6e5f461e";
cout << WinMD5(data.data(), data.size()* sizeof(wchar_t));
system("pause");
}
2093211110720710915549134413018604013480
Дополнено: представим что я скинул эту программу другу, у него нету qtcreator, но он хочет запустить программу с интерфейсом на своём пк, что ему делать?Её нужно собрать и поставлять вместе со всеми библиотеками: https://evileg.com/ru/post/163/
(сразу - никак Qt)
HDC hdcMem = CreateCompatibleDC(hdc); // создаете совместимый контекст
HBITMAP hbmOld = SelectObject(hdcMem, hBitmap); // устанавливаете там свой bitmap
GetPixel(hdc, x, y); // получаете свой пиксель
SelectObject(hdcMem, hbmOld); // возвращаете назад битмап контекста
DeleteDC(hdcMem); // удаляете контекст, что уже не нужен
);
Вопрос довольно короток. Есть ли смысл изучать сначала С, а потом С++?
Чем лучше программист знает С, тем труднее будет для него при программировании на С++ отойти от
стиля программирования на С.
Для изучения С++ не обязательно знать С. Программирование на С способствует усвоению приемов и
даже трюков, которые при программировании на С++ становятся просто ненужными.
Тем не менее, хорошие программы на языке С по сути являются
программами на С++. Например, все программы из классического описания С (K&R) являются
программами на С++. В процессе изучения С++ будет полезен опыт работы с любым языком со
статическими типами.