Yip*_*Yay 5 c++ byte atl char unsigned-char
我对unsigned char(也在BYTEWinAPI 中)和char指针之间的差异感到有些困惑。
目前我正在处理一些基于 ATL 的遗留代码,我看到了很多如下所示的表达式:
CAtlArray<BYTE> rawContent;
CALL_THE_FUNCTION_WHICH_FILLS_RAW_CONTENT(rawContent);
return ArrayToUnicodeString(rawContent);
// or return ArrayToAnsiString(rawContent);
Run Code Online (Sandbox Code Playgroud)
现在,实现ArrayToXXString看起来如下:
CStringA ArrayToAnsiString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
// Casting from BYTE* -> LPCSTR (const char*).
return CStringA((LPCSTR)copiedArray.GetData());
}
CStringW ArrayToUnicodeString(const CAtlArray<BYTE>& array)
{
CAtlArray<BYTE> copiedArray;
copiedArray.Copy(array);
copiedArray.Add('\0');
copiedArray.Add('\0');
// Same here.
return CStringW((LPCWSTR)copiedArray.GetData());
}
Run Code Online (Sandbox Code Playgroud)
所以,问题:
对于所有可能的情况,从BYTE*到LPCSTR( const char*)的 C 样式转换是否安全?
将数组数据转换为宽字符串时是否真的需要添加双空终止?
转换例程CStringW((LPCWSTR)copiedArray.GetData())对我来说似乎无效,是真的吗?
有什么方法可以使所有这些代码更容易理解和维护?
当涉及到字节的定义时,C 标准有点奇怪。不过,您确实有一些保证。
此定义与字节长度为 6 或 7 位的旧平台不太吻合,但它确实意味着BYTE*,并且char *保证是等效的。
Unicode 字符串末尾需要多个空值,因为存在以零(空)字节开头的有效 Unicode 字符。
至于让代码更容易阅读,这完全是风格问题。这段代码似乎是用许多旧的 C Windows 代码使用的风格编写的,这种风格肯定已经失宠了。可能有很多方法可以让你更清楚,但如何让它更清楚却没有明确的答案。
| 归档时间: |
|
| 查看次数: |
3230 次 |
| 最近记录: |