unsigned char 和 char 指针之间的区别

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())对我来说似乎无效,是真的吗?

  • 有什么方法可以使所有这些代码更容易理解和维护?

Swi*_*iss 3

当涉及到字节的定义时,C 标准有点奇怪。不过,您确实有一些保证。

  • 一个字节的大小始终是一个字符
    • sizeof(char) 始终返回 1
  • 一个字节的大小至少为 8 位

此定义与字节长度为 6 或 7 位的旧平台不太吻合,但它确实意味着BYTE*,并且char *保证是等效的。

Unicode 字符串末尾需要多个空值,因为存在以零(空)字节开头的有效 Unicode 字符。

至于让代码更容易阅读,这完全是风格问题。这段代码似乎是用许多旧的 C Windows 代码使用的风格编写的,这种风格肯定已经失宠了。可能有很多方法可以让你更清楚,但如何让它更清楚却没有明确的答案。