문제

하고 싶을 넣어 바이트 배열로,그러나 문자열 수 있습니다 너무 큰습니다.는 경우에는 그것이 너무 크고 싶으로 넣어의 많은 문자열로 가능한으로 배열입니다.이 있는 효율적인 방법을 알아는 얼마나 많은 문자 적합한가?

도움이 되었습니까?

해결책

하기 위해서 잘라내는 문자열을 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);
}

반환된 문자열 수 있습이 안전하게 전송 바이트 배열의 길이는 최대 길이.

다른 팁

당신이 사용해야 인코딩 등을 변환하는 바이트 배열에 올바른?모두 인코딩체가 재정의하는 방법 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,당신의 코드를 하지 않는 당신이 무엇을 명백하다고 생각합니다.Pre-할당 바이트 버퍼 귀하의 경우에는 순수한 낭비 때문에 그것이 사용되지 않습니다.오히려 당신의 할당 삭제 할당된 메모리고 다시 설정 arr 참조점을 다른 버퍼문 Encoding.GetBytes 새 배열을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top