簡體   English   中英

這段與 C++ 代碼相關的 char 字符串有什么作用?

[英]What does this char string related piece of C++ code do?

bool check(const char *text) {
    char c;
    while (c = *text++) {
        if ((c & 0x80) && ((*text) & 0x80)) {
            return true;
        }
    }
    return false;
}

0x80是什么,整個神秘的 function 是做什么的?

測試非零的x & 0x80表達式的結果(如您顯示的代碼中所做的兩次)檢查char操作數( x )的最高有效位(位 7)是否設置為1 在您的情況下,代碼循環通過給定的字符串查找設置了該位的兩個連續字符( c ,它是“當前”字符的副本,以及*test ,下一個)。

如果找到這樣的組合,則 function 返回true 如果未找到並且循環到達nul終止符(因此c = *text++表達式變為零),則返回false

至於為什么要進行這樣的檢查——我只能猜測,但是如果設置了高位,那么字符將不是標准的 ASCII 值(並且可能是 Unicode 對中的第一個,或者其他一些多字節字符表示)。


可能有用的參考資料:


1請注意,這種按位與測試實際上是檢查該位的唯一安全方法,因為 C++ 標准允許char類型是有signed的(測試負值是一種替代方法)或unsigned的(測試 >=需要 128 個); 如果實現的char具有“錯誤”類型的簽名,那么這些測試中的任何一個都將失敗。

如果沒有更多上下文,我不能完全確定,但它看起來像 function 檢查字符串是否包含經典 7 位 US-ASCII 范圍之外的任何 UTF-8 字符。

while (c=*text++)將循環直到在 C 風格的字符串中找到 nul 終止符; 將每個char分配給c c & 0x80檢查是否設置了c的最高有效位。 *text & 0x80text指向的char執行相同的操作(這將是c之后的字符,因為它是作為while條件的一部分遞增的)。

因此,如果text指向的字符串中任意兩個相鄰的char設置了它們的最高有效位,則此 function 將返回true UTF-8 中的任何代碼點 U+0080 及以上的情況都是如此; 因此我猜測這個 function 是用於檢測 UTF-8 文本。

重寫為不那么緊湊:

while (true)
{
    char c = *text;
    text += 1;
    if (c == '\0') // at the end of string?
        return false;
    
    int temp1 = c & 0x80;          // test MSB of c
    int temp2 = (*text) & 0x80;    // test MSB of next character
    if (temp1 != 0 && temp2 != 0)  // if both set the return true
        return true;
}

MSB 表示最高有效位。 位 7。 純 ascii 字符為零

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM