簡體   English   中英

如何在C#中轉換為字節時截斷字符串?

[英]How do I truncate a string while converting to bytes in C#?

我想將一個字符串放入一個字節數組,但字符串可能太大而不適合。 在它太大的情況下,我想盡可能多地將字符串放入數組中。 有沒有一種有效的方法可以找出適合的字符數量?

為了將字符串截斷為UTF8字節數組而不在字符中間分割,我使用:

static string Truncate(string s, int maxLength) {
    if (Encoding.UTF8.GetByteCount(s) <= maxLength)
        return s;
    var cs = s.ToCharArray();
    int length = 0;
    int i = 0;
    while (i < cs.Length){
        int charSize = 1;
        if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
            charSize = 2;
        int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
        if ((byteSize + length) <= maxLength){
            i = i + charSize;
            length += byteSize;
        }
        else
            break;
    }
    return s.Substring(0, i);
}

然后可以將返回的字符串安全地傳輸到長度為maxLength的字節數組。

您應該使用Encoding類來轉換為字節數組是否正確? 所有Encoding對象都有一個重寫方法GetMaxCharCount,它將為您提供“通過解碼指定字節數產生的最大字符數”。 您應該能夠使用此值修剪字符串並對其進行正確編碼。

有效的方法是找出每個角色需要多少(悲觀)字節

Encoding.GetMaxByteCount(1);

然后將你的字符串大小除以結果,然后轉換那么多字符

public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

如果你想使用更少的內存

Encoding.GetByteCount(string);

但這是一個慢得多的方法。

.NET中的Encoding類有一個名為GetByteCount的方法,它可以接受字符串或char []。 如果傳入1個字符,它將告訴您在使用的任何編碼中,該1個字符需要多少字節。

方法GetMaxByteCount更快,但它執行最壞情況計算,可能返回比實際需要更高的數字。

暫無
暫無

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

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