سؤال

أنا في حاجة لتحويل 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() عند تهيئة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top