Windows サーバーで実行されているC プログラムと通信するアプリを開発しています。このプログラムは Visual Studio を使用して開発されています (この情報が役立つ場合)。
サーバーはソケット通信を介して整数を送信します. サーバーを送信する前に、次のことを行います:-
- int を宣言する
- それに何らかの値を割り当てます
- 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の繰り返しを行う最良の方法は何ですか?
私はこのスレッドにアクセスしましたが、それはあまり役に立ちません。
編集 私は私のために働いた次の4つの方法を実装しました、
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 };
}
}