C ++ 서버는 HTON에 Java NTOHS 클라이언트 변환에 대한 HTON입니다
-
05-07-2019 - |
문제
C ++ 및 Java를 사용하여 클라이언트를 사용하여 서버가 개발되는 작은 TFTP 클라이언트 서버 앱을 만들고 있습니다.
여기에서 나는 "블록 수"값을 사용하고 있습니다. htons
변환.
그러나 클라이언트에서 원래 가치로 다시 변환 할 수 없습니다.
예를 들어 블록 수를 보내는 경우 ntohs(01)
(2 바이트) 서버에서 클라이언트로. 클라이언트는 바이트로 읽고 있습니다. 내가받는 값은 바이트 0과 바이트 1입니다.
솔루션을 제공 할 수 있다면 제발.
해결책
나는 당신이 당신이 사용한다는 것을 의미합니다 ntohs
에게 풀다 값은 네트워크에서 읽습니다 htons
에게 인코딩 네트워크를 통해 전송 된 값.
들여다보다 ByteBuffer#getShort()
함께 ByteBuffer#order(ByteOrder)
. 네트워크 바이트 순서 ~이다 빅 엔디언, 값을 사용하십시오 ByteOrder#BIG_ENDIAN
구성합니다 ByteBuffer
제대로. 주목하십시오 BIG_ENDIAN
기본 순서이지만이 경우 선호도를 명시 적으로 명시하는 것이 좋습니다.
Java에서 네트워크 커뮤니케이션에 사용하는 내용은 언급하지 않았습니다. 그것이 a java.net.Socket
, 전화해도됩니다 Socket#getChannel()
얻기 위해 java.nio.channels.SocketChannel
, 하위 유형 java.nio.channels.ByteChannel
, 당신이 사용할 수있는 ByteBuffer
데이터를 읽고 쓰기 위해.
다른 팁
private void somemethod(){
byte[] fileDataFull = new byte[516];
byte[] receivedCounter = new byte[2];
readLength = in.read(fileDataFull);
receivedCounter[0] = fileDataFull[2];
receivedCounter[1] = fileDataFull[3];
if (expectedPktCount == convertntohs(receivedCounter)){
}
byte[] b = converthtons((short) expectedPktCount);
}
private short convertntohs(byte[] value) {
ByteBuffer buf = ByteBuffer.wrap(value);
return buf.getShort();
}
private byte[] converthtons(short sValue) {
byte[] baValue = new byte[2];
ByteBuffer buf = ByteBuffer.wrap(baValue);
return buf.putShort(sValue).array();
}
Java의 숫자는 내부적으로 항상 네트워크 바이트 순서, 기본 정수/복식이없는 시스템에서도 항상 네트워크 바이트 순서입니다. 즉, Java.io.datainput를 구현하는 이러한 종류의 변환을 수행하는 기본 입력 스트림으로 Java로 들어오는 숫자를 Java로 변환 할 수 있습니다. Java.nio.channel을 사용하는 경우 Bytebuffer도 작동하지만 엔디 언을 변경할 수 있습니다 (ByteBuffer.order()
), 기본값은 네트워크 바이트 주문 및 Java 내부 스토리지에 맞습니다.
그건 그렇고, 나는 당신이 사용한다는 것을 의미한다고 생각합니다 htons
그러나 예에서 당신은 보여줍니다 ntohs
. C ++에서 전송하면 변환하려고합니다 시간OST 주문 Network 주문. Java (또는 모든 클라이언트)로부터 수신하면 서버가 ntohs
.