2013-04-08 1 views
0

크기 제한이 1 바이트 여야한다는 제한이 Java에서 부호없는 바이트를 구현하는 방법 즉 short 또는 int로 변환 할 수 없습니다. 그리고 ' ing with 0xFF자바에서 부호없는 바이트를 구현하는 방법 크기 제한은 1 바이트 여야합니다

소켓을 통해 부호없는 바이트 배열을 전송해야합니다. 수신 끝은 크기가 1 바이트 인 부호없는 바이트 배열 만 필요로하는 C 코드 메서드입니다.하지만 Java는 부호없는 바이트 개념을 지원하지 않으므로 문제가 발생합니다. . 이를 달성 할 수있는 방법이 있습니까?

바이트 b = (바이트) 0xF0; 또는 심지어 바이트 b1 = 0x00; 소켓 채널을 통해 제대로 보내지 않습니다. 서버에 쓰기위한 방법을 참조하십시오.

공공 무효 인 코드 (IoSession 세션 개체 메시지, ProtocolEncoderOutput 아웃) 그냥 당신이 바이트의 8 개 비트를 해석하는 방법의 예외를 {

//lProxylogger.info("Inside ProtocolEncoderAdapter. Encoding response to client.."); 
    String response ; 

    //lProxylogger.info("The response length in encode adapter is "+ response.length()+" Message="+response); 
    byte[] responseStream; 

    response=(String) message; 

    responseStream= response.getBytes("windows-1252"); 

    //responseStream=serialize(message); 

    IoBuffer buffer = IoBuffer.allocate(responseStream.length); 
    // buffer.putInt(response.length); 
    //IoBuffer buffer=(IoBuffer)message; 
     // buffer.putObject(message); 
    System.out.println("Encoded Response:"+new String(responseStream)); 
    for(byte b:responseStream) 
     System.out.print(b+","); 
    System.out.println(); 
    buffer.put(responseStream); 
//  lProxylogger.info("the response buffer size is "+ buffer.capacity()); 
    buffer.setAutoShrink(true); 
    buffer.shrink(); 
    // lProxylogger.info("After shrinking the buffer size is "+ buffer.capacity()); 
    buffer.flip(); 

    //System.out.println("Writing response to Stream.."); 
    out.write(buffer); 

} 
+0

나는이 문제가 C 측에서 바이너리를 출력하는 방법이라고 생각한다. 내 대답을 보라. –

답변

4

서명 네스가 발생합니다. 서명을함으로써 더 이상 짧지도 않으며 전송하는 데 다소 차이가 없습니다. 방금 바이트를 보냅니다. 서명되지 않은 바이트는 unsigned로 취급하기 위해 바이트를 해석하지만 8 비트로 표시하거나 보내는 것과는 아무 상관이 없습니다.

+0

Sean에게 답장을 보내 주셔서 감사합니다. 소켓을 통해 0xF0 (-16 ASCII 변환) 또는 0x00을 보내려고했는데 소켓 끝을 통해 값이 올바르게 (일부 정크) 디코딩되지 않았습니다. Java 코드를 사용하고 있습니다. 수신 끝은 C로 구현되었으며 Redhat Linux 플랫폼을 사용하고 있습니다. – CodeFReak

+0

말하자면, C 코드에서 "디코딩"(서명 된 것으로 해석)에 문제가 있습니다. 자바에서 보내는/인코딩 측과 관련이 없습니다. –

+0

정확히 내 목표는 0xF0,0x00 같은 값을 부호없는 바이트를 기대하는 C 코드 서버에 소켓을 통해 보내는 것입니다. 서버에서 모든 값을 정확하게 수신하고 디코딩 할 수 있지만 이러한 값을 보내려고하면 수신 측에서 예상하지 못한 정크가보고됩니다. 여기 내 구현 서버에 데이터를 보낼 수 있습니다 (out.write 메서드는 서버에 마지막으로 쓰기) – CodeFReak

0

문자 인코딩을 선택하면 문자열이 손상 될 수 있습니다. 이와 같은 인코딩을 사용하는 경우 텍스트에 바이너리를 배치하지 마십시오.

코드를 단순화하는 것이 좋습니다. 이것이 내가 기본적으로 같은 일을 않는 ISO-8859-1 인코딩을 시도하는 것이 좋습니다 작동하는 경우 대신

String response=(String) message; 
for(char ch : response.toCharArray()) { 
    System.out.println(Integer.toHexString(ch) + ", "); 
    out.write(ch); 
} 

을 시도합니다.

+0

또한 char 배열로 변경하면 서버가 오버플로로 이어질 것으로 예상되는 동안 1 바이트를 기대하는 반면 크기를 2 바이트로 늘립니다. 다른 인코딩을 시도했지만 ISO-8859-1로 변경하면 Windows-1252의 하위 집합이기 때문에 작동하지 않습니다. – CodeFReak

+0

ISO-8859-1은 변경하지 않고 1 바이트로 표현할 수있는 모든 문자를 인코딩합니다. 이것은 문자열에 얽매이지 않고 바이너리를 취할 것입니다. –

+0

Windows에서 인코딩 작업을 수행하는 방법을 분명히 알지 못합니다. 1252는 일부 문자를 1-2 바이트로 바꿀 수 있습니다. 즉, 4 바이트에서 4 문자를 얻지 못할 수도 있습니다. –

관련 문제