我想把一串成一个字节阵列,但串可能过大,以适应。在该情况下它太大了,我想要把尽可能多的串尽可能进入阵列。有没有一种有效的办法,找出如何的许多角色会适合吗?

有帮助吗?

解决方案

为了截断串到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.

其他提示

你应该使用的编码类做你转换为字阵列是否正确?所有编码的对象有一个复盖的方法GetMaxCharCount,这会给你"最大数量所产生的字符码指定的数字节。" 你应该能够使用这种价值修剪你的串和正确的编码。

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

Encoding.GetMaxByteCount(1);

然后除以你的串的大小通过的结果,然后转换多少字符

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

如果你想使用较少使用的存储器

Encoding.GetByteCount(string);

但慢得多的方法。

编码类。净具有一种方法称为 GetByteCount 这可能需要在一串或char[].如果你通过在1角,它将告诉你多少字节的需要,1的性格无论在哪一个编码使用。

该方法 GetMaxByteCount 是速度更快,但它没有一个最糟糕的是计算其能返回的一个更高的数字比实际需要。

Cookey,你的代码没有做什么你明显的认为它没有。预先分配的字节的缓冲区在你的情况是纯粹的浪费,因为它将不能使用。而你的任务滴分配的存储和重置 arr 参考点到另一个缓冲区,因为 Encoding.GetBytes 返回一个新阵列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top