如何在 C# 中转换为字节时截断字符串?

Posted

技术标签:

【中文标题】如何在 C# 中转换为字节时截断字符串?【英文标题】:How do I truncate a string while converting to bytes in C#? 【发布时间】:2010-09-07 06:10:22 【问题描述】:

我想将一个字符串放入一个字节数组中,但该字符串可能太大而无法容纳。在它太大的情况下,我想将尽可能多的字符串放入数组中。有没有一种有效的方法来找出适合多少个字符?

【问题讨论】:

【参考方案1】:

为了将字符串截断为 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 的字节数组中。

【讨论】:

【参考方案2】:

您应该使用 Encoding 类来正确转换为字节数组吗?所有 Encoding 对象都有一个重写方法 GetMaxCharCount,它将为您提供“解码指定字节数产生的最大字符数”。您应该能够使用此值来修剪您的字符串并对其进行正确编码。

【讨论】:

如果他的限制是字节数,这不起作用。 (仅当限制为字符数时)【参考方案3】:

有效的方法是找出每个字符需要多少(悲观)字节

Encoding.GetMaxByteCount(1);

然后将你的字符串大小除以结果,然后用

转换那么多字符
public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

如果你想使用更少的内存使用

Encoding.GetByteCount(string);

但这是一个慢得多的方法。

【讨论】:

【参考方案4】:

.NET 中的 Encoding 类有一个名为 GetByteCount 的方法,它可以接收字符串或 char[]。如果您传入 1 个字符,它将告诉您在使用哪种编码时,该 1 个字符需要多少字节。

GetMaxByteCount 方法更快,但它执行的最坏情况计算可能会返回比实际需要的数字更高的数字。

【讨论】:

以上是关于如何在 C# 中转换为字节时截断字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将固定字节/字符 [100] 转换为托管字符 []?

如何在C#中将字节转换为字符串[重复]

在 C# 中将字符串转换为字节数组

在 C# 中有效地将字符串转换为字节数组(不使用编码)[重复]

如何在 c# 中将字符串从 utf8 转换(音译)为 ASCII(单字节)?

将字节数组转换为字符串在c#中不起作用