我正在开发一个与 Windows 服务器上运行的C 程序通信的应用程序,该程序是使用 Visual Studio 开发的(如果此信息有任何帮助)。
服务器通过套接字通信向我发送一个整数,在发送服务器之前执行以下操作:-
- 声明一个整数
- 赋予它一些价值
- 使用memcpy将 2 个字节复制到 char * (比如缓冲区)
- 向该缓冲区添加更多数据
- 发送该缓冲区
现在在接收端我有java实现,所以不能直接使用memcpy,我用过
short mId = java.nio.ByteBuffer.wrap(recvBuf, 0, 2).order(ByteOrder.LITTLE_ENDIAN).getShort();
可以,很好,但是这部分代码每隔几毫秒就会调用一次,所以我正在尝试优化它..我也使用过
short mId =(short)(recvBuf[0] + recvBuf[1]*128);
这也可以正常工作,但我怀疑如果将来数量增加,它是否会起作用。在 java中重复memcpy的最佳方法是什么?
我已经访问过这个线程,但这并没有太大帮助,
编辑 我实现了以下四种对我有用的方法,
public class CommonMethods {
/*
* Returns the byte[] representation of an int in Little Endian format
*
* @param value that should be converted to byte[]
*/
public static byte[] toByteArray(int value) {
return new byte[] { (byte) value, (byte) (value >> 8), (byte) (value >> 16), (byte) (value >> 24) };
}
/*
* Returns the int in LittleEndian value of the passed byte[]
*
* @param bytes is the input byte[]
*
* @param offset is the offset to start
*/
public static int getInt(byte[] bytes, int offset, int length) {
int retValue = (bytes[offset] & 0xFF);
byte bVal;
for (int i = 1; i < length; i++) {
bVal = bytes[offset + i];
retValue |= ((bVal & 0xFF) << (8 + (8 * (i - 1))));
}
return retValue;
}
/*
* Returns the int in BigEndian from the passed byte[]
*
* @param bytes is the byte[]
*/
public static int getIntBigEndian(byte[] bytes, int offset, int length) {
int retValue = (bytes[offset + length - 1] & 0xFF);
for (int i = 1; i < length; i++) {
retValue |= ((bytes[offset + length - 1 - i] & 0xFF) << (8 + (8 * (i - 1))));
}
return retValue;
}
/*
* Returns the byte[] representation of an int in Big Endian format
*
* @param value that should be converted to byte[]
*/
public static byte[] toByteArrayBigEndian(int value) {
return new byte[] { (byte) (value >> 24), (byte) (value >> 16), (byte) (value >> 8), (byte) value };
}
}