2014-10-16 5 views
0

나는 "Buffer"가 내가 원하는 것을 확신하지 못하기 때문에 내 문제를 보여줄 것이고, 그러면 여러분은 그 단어가 올바른 단어인지 해결책인지를 결정할 수 있습니다. 현재 C#에서 Java DataOutputStream 클래스의 네트워킹 포트를 만드는 중입니다. 마지막으로해야 할 일은 분할 된 정보를 보내는 것으로이 문제를 해결하는 것입니다.세그먼트를 보내는 C# BinaryWriter 버퍼?

가 여기에 C#에서 내 내의 writeInt 방법의 비교하고자하는 사람들을위한

public void WriteInt(int v) 
{ 
    ClientOutput.Write (((uint)v >> 24) & 0xFF); 
    ClientOutput.Write (((uint)v >> 16) & 0xFF); 
    ClientOutput.Write (((uint)v >> 8) & 0xFF); 
    ClientOutput.Write (((uint)v >> 0) & 0xFF); 
    IncCount (4); 
} 

(ClientOutput는 BinaryWriter의 인스턴스입니다); 여기 의 원본 데이터가 서버 또는 클라이언트로 전송 될 것입니다 전에 "()세척"을 호출하는 자바 자바에서 일반적으로

public final void writeInt(int v) throws IOException { 
     out.write((v >>> 24) & 0xFF); 
     out.write((v >>> 16) & 0xFF); 
     out.write((v >>> 8) & 0xFF); 
     out.write((v >>> 0) & 0xFF); 
     incCount(4); 
} 

당신이 가지고있는 것입니다; 그러나 당신이 "쓰기()"를 호출 할 때마다 BinaryWriter가 자동으로 플러시 것으로 보인다

여기 자바에서 "ReadInt()"코드입니다.

public final int readInt() throws IOException { 
     int ch1 = in.read(); 
     int ch2 = in.read(); 
     int ch3 = in.read(); 
     int ch4 = in.read(); 
     if ((ch1 | ch2 | ch3 | ch4) < 0) 
      throw new EOFException(); 
     return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 
} 

자바 코드가 서버에서 호출 "내의 writeInt"와 ReadInt에 실행되면, 값이 제대로 표시; 그러나 현재 서버는 정수를 4 번 처리하고 세그먼트를 기준으로 정수 값을 표시합니다.

예 입력 (C#을) :

Client.WriteInt(1000); 

예 출력 (자바) : 출력해야하는 경우

0 
0 
50331648 
-402653184 

:

1000 

참아주세요 내가 방금 C# 몇 가지를 집어 들었다. 며칠 전 바보 같은 질문을하고있는 것 같습니다.

답변

0

BinaryWriter에는 Write() 메서드 오버로드가 많으며 Write (Int32) 오버로드를 호출하는 것처럼 보입니다. 물론 4 바이트 정수 4 개를 보냅니다.

당신은) (쓰기의 호출로 바이트에 값을 캐스팅하는 것만으로 문제를 해결할 수있을 것입니다 : 기술적으로 말하기

public void WriteInt(int v) 
{ 
    ClientOutput.Write ((byte)(((uint)v >> 24) & 0xFF)); 
    ClientOutput.Write ((byte)(((uint)v >> 16) & 0xFF)); 
    ClientOutput.Write ((byte)(((uint)v >> 8) & 0xFF)); 
    ClientOutput.Write ((byte)(((uint)v >> 0) & 0xFF)); 
    IncCount (4); 
} 

주, 당신이 uint로 v 값을 캐스팅 할 필요가 없습니다 교대하기 전에. sign-extension이 발생했다 할지라도 어쨌든 마지막 바이트를 제외한 모든 것을 마스킹합니다. 그러나 그 부분은 아무런 상처를주지 않아야합니다.

Jon Skeet의 endian-aware 버전의 BinaryWriter를 확인하십시오. 여기에 토론과 링크가 있습니다 : BinaryWriter Endian issue

+0

'uint'로 캐스팅 한 유일한 이유는 java로 작성된 원래 라이브러리가 부호없는 교대를 사용했기 때문입니다. 나는 그 방법을 지키기 위해 이유가 있다고 생각했습니다.일단 집에 돌아와서 제대로 작동하는지 확인해보고 나서이 도구를 사용해 보겠습니다. – Hobbyist

+0

완벽하게 작동합니다. 감사합니다. – Hobbyist