لا يمكن تحويل CString إلى صفيف بايت
سؤال
أنا في حاجة لتحويل CString إلى صفيف بايت.أنا لا أعرف لماذا ولكن كل ما وجدته في الإنترنت لا يعمل :( على سبيل المثال لدي
CString str = _T("string");
لا 1)
BYTE *pbBuffer = (BYTE*)(LPCTSTR)str;
2)
BYTE *pbBuffer = new BYTE[str.GetLength()+1];
memcpy(pbBuffer, (VOID*)(LPCTSTR)StrRegID, str.GetLength());
3)
BYTE *pbBuffer = (BYTE*)str.GetString();
و دائما pbBuffer يحتوي فقط أول حرف من str
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
2
ولكن إذا كنت تستخدم const سلسلة:
BYTE *pbBuffer = (BYTE*)"string";
pbBuffer تحتوي كل سلسلة
أين هو الخطأ ؟
المحلول
الخاص بك CString Unicode (اثنين بايت لكل حرف) و تحاول أن تفسر على أنها ANSI (واحد بايت لكل حرف).وهذا يؤدي إلى نتائج لا تتوقع.
بدلا من صب الأساسية العازلة في char*
تحتاج إلى تحويل البيانات.استخدام WideCharToMultiByte() من أجل ذلك.
نصائح أخرى
ربما تجميع مع يونيكود.وهذا يعني أن CString يحتوي على wchar_t بدلا من شار.تحويل wchar_t مؤشر إلى شار مؤشر يسبب لك تفسير البايت الثاني من أول wchar_t كسلسلة منهي (منذ أن قبل 0 الأكثر شيوعا الشخصيات)
عند استخدام visual studio يجب عليك دائما استخدام _T() أن تعلن سلسلة حرفية و TCHAR حسب نوع شخصيتك.في حالة الخاص بك:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
يمكنك الحصول على العازلة ، ولكن كل بايت على الأرجح هو صفر.
استخدام CStringA إذا كنت بحاجة إلى سلسلة ANSI.(ولكن بعد تخطي _T() عند تهيئة)