2017-01-25 2 views
-1
string longMessage = "";//The string to convert to bytes 
for (int i = 0; i < 999; i++)//Adding 999 chars 
{ 
    longMessage += "i"; 
} 
byte[] buffer = new byte[1024];//Array of bytes to store the message 
Stream stream = new MemoryStream(buffer); 
BinaryFormatter formatter = new BinaryFormatter(); 
formatter.Serialize(stream, longMessage); 

문자열에 999 개 이상의 문자를 넣을 때 오류가 발생하고 1024 자 이후가 아닌 이유는 무엇입니까?C# : 왜 999 개의 문자 만 1024 바이트로 변환 할 수 있습니까?

NotSupportedException: Cannot expand this MemoryStream

ERROR : 그것은 실제의 형태가 다시 역 직렬화해야하는지에 그건 모르는 것이 이러한 유형의 정보가 없으면 나는 다음과 같은 오류가 발생합니다.

+2

당신이 우리에게 실제 오류 정보를 제공하는 것을 잊지나요? 나는 무슨 일이 일어나고 있는지 짐작하지 않는다. –

+0

@ rory.ap NotSupportedException :이 MemoryStream을 확장 할 수 없습니다 – Aviv

+1

이 정보를 포함하려면 실제 질문을 편집하십시오. 나는 당신이 왜 그걸로 시작하지 않았을 지 모르겠다. ... –

답변

1

캐릭터 자체가 인코딩이있다 -은 1 개 바이트 문자의 단지 배열이 아니다. 해당 문자열에 대한 추가 정보와이를 읽는 방법 (ASCII, 유니 코드, UTF 등)을 포함합니다.

사용할 수있는 입력 문자열에서 1024 바이트 배열을 얻기 위해 ASCII 인코딩을 사용하려면 다음

string longMessage = "";//The string to convert to bytes 
for (int i = 0; i < 1024; i++)//Adding 1024 chars 
{ 
    longMessage += "i"; 
} 
byte[] buffer = Encoding.ASCII.GetBytes(longMessage); 
+0

내가 사용한 인코딩은 유니 코드입니까? – Aviv

+0

@Aviv 네, UTF-16은 .NET, Java, JavaScript, XML, HTML 등의 모든 문자열과 같습니다. 주로 서구의 스크립트가있는 텍스트를 더 작게하려면 (동부 표준에서 텍스트를위한 공간을 더 많이 사용하는 대신에)'buffer = Encoding.UTF8.GetBytes (longMessage)'를 사용하십시오. 자동 데이터 손실을 원하면 ASCII를 사용하십시오. 어쨌든 직렬화 및 직렬화 해제 루틴은 동일한 인코딩을 사용해야합니다. –

1

BinaryFormatter은 실제 데이터 외에 유형 정보를 방출하기 때문에. 즉, 문자열을 저장 중임을 나타내는 추가 바이트가 있음을 의미합니다. BinaryFormatter가 이식 가능하지 않기 때문에 사용중인 .NET Framework 버전에서이 유형 정보는 25 바이트를 차지합니다.

이 유형 정보가 없으면 실제 유형을 다시 역 직렬화해야한다는 것을 알지 못합니다.

그래서 기본적으로 당신은 바이너리 직렬화 필요에 따라만큼 바이트를 보자 수 :

using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, longMessage); 
    byte[] actualData = stream.ToArray(); 
}