网络字节顺序 - 电报

时间:2016-10-27 09:49:02

标签: java networking

早上好

我正在编写一个需要通过ATS软件与Verifone vx820 ped通信的应用程序。

在他们的文档中,为了传输数据,它说:

transmitting data

我在c#中有一个如何做的例子,这是:

// Format of ATS telegram:
            //
            //       +---------------------------- ... ---------------------------------+
            //       | xx | xx | xx | xx | Data                                         |
            //       +---------------------------- ... ---------------------------------+
            // Byte  |  0 |  1 |  2 |  3 | 4       ... 
            //       |                   |
            // Field | -- Data Length -- | Data
            //
            // Data length is 4 bytes; network byte order (big-endian)

            try
            {
                // Attempt to make TCP connection to ATS
                Connect();

                // Convert data length to network byte order...
                int iLengthNetworkByteOrder = IPAddress.HostToNetworkOrder(Data.Length);

                // ...then convert it to a byte array
                byte[] DataLength = BitConverter.GetBytes(iLengthNetworkByteOrder);

                // Construct the send buffer, prefixing the data with the data length as shown above
                m_SendBuffer = new byte[DataLength.Length + Data.Length];
                DataLength.CopyTo(m_SendBuffer, 0);
                Data.CopyTo(m_SendBuffer, DataLength.Length);

                // Signal the background thread there is data to send
                m_eventSendDataAvailable.Set();
            }

但是我正在构建这个是java。任何人都可以帮我转换为Java。 Java中有简单的方法可以做到这一点吗?

有没有人构建了一个使用ATS和java的应用程序,我应该知道有什么用处

1 个答案:

答案 0 :(得分:1)

在Java中,你有一个很棒的ByteBuffer类,它允许你对普通值(整数,浮点数,双精度)进行编码/解码。 ByteBuffer允许您通过order(ByteOrder)方法指定使用的字节序。

所以,假设你有一个byte[] data,你希望用32位大端的长度作为前缀,如你的例子所示。你写的是:

// Create a buffer where we'll put the data to send
ByteBuffer sendBuffer = ByteBuffer.allocate(4 + data.length);
sendBuffer.order(ByteOrder.BIG_ENDIAN); // it's the default, but included for clarity

// Put the 4-byte length, then the data itself
sendBuffer.putInt(data.length);
sendBuffer.put(data);

// Extract the actual bytes from our sendBuffer
byte[] dataToSend = sendBuffer.array();

如果您有相反的情况(ATS向您发送带有前缀长度的数据),代码将非常相似,但代之以getIntget