【背景】
在折腾:
【记录】给usb-serial-for-android中的Silicon Labs的CP2102中添加RTS和DTR的支持
期间,需要将一个byte的数组转换为int。
【折腾过程】
1.参考:
Converting from byte to int in java
去取数组index为0的即可:
byte[] partNum = new byte[]{0};
.....
int gotPartNum = partNum[0];
【总结】
直接将(byte)数组的对应某个值(通过index取),赋值给int变量即可。
【后记】
1.后来遇到:
//1. verify baudrate
byte[] baudrateByteArr = new byte[]{0,0,0,0};
mConnection.controlTransfer(REQTYPE_INTERFACE_TO_HOST, CP210X_GET_BAUDRATE,
0, 0/* index */, baudrateByteArr, 4, USB_CTRL_GET_TIMEOUT_MILLIS);
int readbackBaudrate = (baudrateByteArr[0]) | (baudrateByteArr[1] << 8) | (baudrateByteArr[2] << 16) | (baudrateByteArr[3] << 24);
if(writtenBaudrate == readbackBaudrate){
//ok
}
else{
//false
}其中:
baudrateByteArr 值是:[-80, 4, 0, 0]
如图:
结果算出来的值是:
-80
是不对的,希望是:
0x4B0
即:
1200 -> 0x4B0 B0 04 00 00 0x000004B0 = 0x4B0 |
所以,继续研究,找到一个好的方式去转换。
去试试:
//int readbackBaudrate = (baudrateByteArr[0]) | (baudrateByteArr[1] << 8) | (baudrateByteArr[2] << 16) | (baudrateByteArr[3] << 24);
int readbackBaudrate= (baudrateByteArr[3]<<24)&0xff000000|(baudrateByteArr[2]<<16)&0xff0000|(baudrateByteArr[1]<<8)&0xff00|(baudrateByteArr[0]<<0)&0xff;结果是:
然后就可以了:
2.虽然工作,但是用起来很不方便,所以去写个函数,最终如下:
//convert byte array to integer type value
//possible returned value: byte/short/int/long
//Note: max support long -> input byte array length should not exceed 8
public static long byteArrToInteger(byte[] byteArr){
long convertedInterger = 0;
//follow works:
//int readbackBaudrate= (baudrateByteArr[3]<<24)&0xff000000|(baudrateByteArr[2]<<16)&0xff0000|(baudrateByteArr[1]<<8)&0xff00|(baudrateByteArr[0]<<0)&0xff;
//115200 == [0, -62, 1, 0]
//1200==[-80, 4, 0, 0]
for(int i = 0; i < byteArr.length; i++){
//long curValue = byteArr[i];
//int curValue = byteArr[i];
byte curValue = byteArr[i];
long shiftedValue = curValue << (i * 8);
long mask = 0xFF << (i * 8);
long maskedShiftedValue = shiftedValue & mask;
//0x0, 0xC200, 0x10000, 0x0 -> 115200==0x1C200
//0xB0, 0x400, 0x0, 0x0-> 1200==0x4B0
convertedInterger |= maskedShiftedValue;
}
return convertedInterger;
}
//convert interger type value to byte array
//possible input value: byte/short/int/long
//Note: max return byte array is 8 -> max support long
public static byte[] integerToByteArr(long inputIntergerValue, int byteLen){
byte[] convertedByteArr = new byte[byteLen];
for (int i = 0; i < convertedByteArr.length; i++) {
convertedByteArr[i] = (byte) ((inputIntergerValue >> (8 * i)) & 0xFF);
//115200 == [0, -62, 1, 0, 0, 0, 0, 0]
//1200==[-80, 4, 0, 0]
//600==[88, 2]
//32==[32]
}
return convertedByteArr;
}
private void testByteArrToInt(){
//byte[] baudrateByteArr1 = new byte[]{0, -62, 1, 0}; //115200
//byte[] baudrateByteArr2 = new byte[]{-80, 4, 0, 0}; //1200
long testLong = 115200; //115200==0x1C200
int testInt = 1200; //1200==0x4B0
short testShort = 600; //600==0x258
byte testByte = 32; //32=0x20
byte[] baudrateByteArr1 = integerToByteArr(testLong, 8); //115200 == [0, -62, 1, 0, 0, 0, 0, 0]
byte[] baudrateByteArr2 = integerToByteArr(testInt, 4); //1200==[-80, 4, 0, 0]
byte[] baudrateByteArr3 = integerToByteArr(testShort, 2); //600==[88, 2]
byte[] baudrateByteArr4 = integerToByteArr(testByte, 1); //32==[32]
int readbackBaudrate1 = (int)byteArrToInteger(baudrateByteArr1); //115200
int readbackBaudrate2 = (int)byteArrToInteger(baudrateByteArr2); //1200
int readbackBaudrate3 = (int)byteArrToInteger(baudrateByteArr3); //600
int readbackBaudrate4 = (int)byteArrToInteger(baudrateByteArr4); //32
android.util.Log.d("testByteArrToInt", "readbackBaudrate1=" + readbackBaudrate1);
android.util.Log.d("testByteArrToInt", "readbackBaudrate2=" + readbackBaudrate2);
android.util.Log.d("testByteArrToInt", "readbackBaudrate3=" + readbackBaudrate3);
android.util.Log.d("testByteArrToInt", "readbackBaudrate4=" + readbackBaudrate4);
}
【总结】
java中,还是很多常见功能没实现,搞得还要自己去写函数。哎。。。
转载请注明:在路上 » 【已解决】java中byte数组转换为int