ج ++ الخادم htons إلى جافا ntohs تحويل العميل
-
05-07-2019 - |
سؤال
وأنا خلق عميل TFTP صغيرة التطبيق الملقم حيث تم تطويرها الخادم باستخدام ج ++ والعميل باستخدام جافا.
وهنا أنا إرسال "كتلة العد" قيمة
باستخدام تحويل htons
.
ولكن أنا لست قادرا على تحويله مرة أخرى إلى قيمتها الأصلية في العميل.
وعلى سبيل المثال إذا أبعث العد كتلة
ntohs(01)
(2 بايت) من الخادم ل
زبون. العميل هو قراءة في بايت.
القيمة التي أتلقاها هي البايت 0
والبايت 1.
تجدر إن وجدت واحدة يمكن أن توفر حل.
المحلول
وأنا أعتبر كنت تعني أن تستخدم ntohs
إلى <م> فك م> القيم القراءة من الشبكة، وhtons
إلى <م> ترميز م> القيم إرسالها عبر الشبكة.
ByteBuffer#getShort()
بالتنسيق مع <لأ href = "http://java.sun.com/javase/7/docs/api/java/nio/ByteBuffer.html#order٪28java.nio.ByteOrder٪29" يختلط = "نوفولو noreferrer"> ByteBuffer#order(ByteOrder)
. ترتيب البايت شبكة م> هو endian كبيرة م>، وذلك باستخدام قيمة <لأ href = "http://java.sun.com/javase/7/docs/api/java/ NIO / ByteOrder.html # BIG_ENDIAN "يختلط =" نوفولو noreferrer "> ByteOrder#BIG_ENDIAN
لتكوين ByteBuffer
بشكل صحيح. لاحظ أن BIG_ENDIAN
هو الترتيب الافتراضي، ولكن في هذه الحالة سيكون شكل جيد لتفضله صراحة.
وأنت لم تذكر ما كنت تستخدم لشبكة الاتصالات في جاوة. اذا كان ل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.io.DataInput. يعمل ByteBuffer أيضا إذا كنت تستخدم java.nio.Channel لكن هناك يمكنك تغيير endianness (ByteBuffer.order()
)، على الرغم من أن الافتراضي هو الصحيح لترتيب شبكة بايت وتخزين داخلية جافا.
وبالمناسبة، أعتقد أنك تقصد أن استخدام htons
لكن في المثال تظهر لك ntohs
. إرسال من C ++ تريد تحويله <ط> ح أجل معاهدة الفضاء الخارجي إلى <ط> ن ترتيب etwork. تلقي من جافا (أو أي عميل) خادمك من شأنه تحويل مرة أخرى باستخدام ntohs
.