سؤال

وأنا خلق عميل 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top