2011-01-28 77 views
0

某些apis需要字符數。字節數與字符數計數

// Why did they choose cch in these functions. 
HRESULT StringCchCopyW(
    __out LPWSTR pszDest, 
    __in size_t cchDest, 
    __in LPCWSTR pszSrc 
); 

errno_t wcscpy_s(
    wchar_t *strDestination, 
    size_t numberOfElements, 
    const wchar_t *strSource 
); 

DWORD WINAPI GetCurrentDirectoryW(
    __in DWORD nBufferLength, // Count of Chars 
    __out LPWSTR lpBuffer 
); 

,而某些API需要的字節數

// What do you prefer cch vs cb function. 
// Do cch functions almost useful? 
HRESULT StringCbCopyW(
    __out LPWSTR pszDest, 
    __in size_t cbDest, 
    __in LPCWSTR pszSrc 
); 

BOOL WINAPI ReadFile(
    __in   HANDLE hFile, 
    __out  LPVOID lpBuffer, 
    __in   DWORD nNumberOfBytesToRead, 
    __out_opt LPDWORD lpNumberOfBytesRead, 
    __inout_opt LPOVERLAPPED lpOverlapped 
); 

// Why did they choose cb in these structures. 
// Because there are some apis uses cb, I always should see MSDN. 
typedef struct _LSA_UNICODE_STRING { 
    USHORT Length; // Count of bytes. 
    USHORT MaximumLength; // Count of bytes. 
    PWSTR Buffer; 
} UNICODE_STRING, *PUNICODE_STRING; 

typedef struct _FILE_RENAME_INFO { 
    BOOL ReplaceIfExists; 
    HANDLE RootDirectory; 
    DWORD FileNameLength; // Count of bytes. 
    WCHAR FileName[1]; 
} FILE_RENAME_INFO, *PFILE_RENAME_INFO; 

當你設計一個功能或數據結構,你如何確定CB或CCH?爲什麼?
要爲呼叫者設計更好的api,我應該知道什麼?

回答

3

如果返回的數據是一個字符串,則應返回字符數,因爲字節數通常無用。但是,如果它是通用的二進制數據(而不是特定的字符串),那麼顯然chars的數量沒有任何意義,所以使用字節數。

至於爲什麼:

我相信LSA_UNICODE_STRING持有的字節數的原因是,它的意思是與UNICODE_STRING,該消息又在NtCreateFile使用兼容。但NtCreateFile需要一個FILE_OPEN_BY_FILE_ID參數,實際上UNICODE_STRING指向LONGLONG值,而不是一個字符串......所以字節數更有意義,雖然我認爲它總體上是一個糟糕的設計:

FILE_OPEN_BY_FILE_ID:ObjectAttributes參數指定的文件名包括該文件的8字節文件引用號。

+0

UNICODE_STRING的解釋非常好。 – Benjamin 2011-01-28 06:23:23

+0

*字節數通常無用。*爲什麼?你能解釋一下嗎? – Benjamin 2011-01-28 08:29:36

0

如果您注意到,您提到的第一組函數都是ASCII函數,所以在這種情況下沒有區別 - 字節數是字符數。這是因爲(通常無論如何)單個ASCII字符的大小恰好是一個字節。

第二組是unicode函數/結構體。在這種情況下,字符不能保證只有一個字節的大小 - 如果是UTF16格式,它們將是兩個字節寬,在UTF32中它們將是四個字符,並且在UTF8中它們將(通常)一到四個字節寬。

特別是對於UTF8數據的情況,如果創建緩衝區,通常會預留一定數量的字節,根據字符大小的不同,字符數可能會有很大的變化。我對你提供的大多數函數/結構都不太熟悉,但如果這與它有關,它並不會讓我感到驚訝。

要回答你的問題,如果你使用ASCII,你可以使用任何一種方法 - 它沒有區別。但是,如果使用可變長度編碼(例如UTF8),則無論使用哪種編碼,都取決於您是僅對所涉及的字符感興趣,還是需要考慮其編碼。