문제

외부 엔티티에서받는 바이트 배열이 있습니다. 고정 된 크기입니다. 바이트는 나머지 버퍼를 패드하기 위해 0 값을 가진 유니 코드 문자열을 포함합니다.

바이트는 다음과 같습니다.

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

그 버퍼를 얻고 같은 문자열로 변환합니다.

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);

내가 돌아 오는 것은 다음과 같이 보이는 문자열입니다.

"HELLO\0\0\0\0\0\0\0\0..."

GetString에게 첫 번째 유니 코드 NULL에서 문자열을 종료하라고 어떻게 알 수 있습니까 (예 : "Hello")가 돌아옵니다.

입력에 감사드립니다.

도움이 되었습니까?

해결책

나머지는 모두 0이라고 확신한다면 이것은 효과가 있습니다.

cmd = cmd.TrimEnd('\0');

그렇지 않으면 첫 번째 널 전에 모든 것을 얻고 싶다면 :

int index = cmd.IndexOf('\0');
if (index >= 0)
   cmd = cmd.Remove(index);

주목하십시오 Unicode.GetString 이중 0s를 처리합니다. 단일 0을 찾아야합니다.

다른 팁

가장 쉬운 방법은 이미 제안한대로 변환 후 문자열을 다듬는 것입니다.

문자 수를 미리 알고 있다면 트리밍없이 올바른 문자열을 얻기 위해 시작 인덱스와 바이트 수를 취하는 GetString 오버로드를 사용할 수 있습니다.

문자 수를 미리 알지 못하고 나중에 문자열을 다듬지 않으려면 먼저 바이트 배열을 다듬어야하므로 관심있는 바이트 만 전달해야합니다. 유니 코드의 경우 바이트를 제거하는 것을 의미합니다. 첫 번째 0 쌍의 0 쌍을 포함합니다.

문자열을 재 처리하는 대신 버퍼에서 널 바이트의 첫 번째 발생을 얻을 수 있습니다 (사용 System.Array.IndexOf). 그런 다음 과부하를 사용할 수 있습니다 System.Text.Encoding.Unicode.GetString 메소드 주어진 버퍼 크기까지 문자열을 생성하는 방법.

아래의 예는 또한 널 바이트가없는 버퍼를 제공합니다.

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top