早上好
我正在编写一个需要通过ATS软件与Verifone vx820 ped通信的应用程序。
在他们的文档中,为了传输数据,它说:
我在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的应用程序,我应该知道有什么用处
答案 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向您发送带有前缀长度的数据),代码将非常相似,但代之以getInt
和get
。