【背景】
在折腾:
【记录】给usb-serial-for-android中的Silicon Labs的CP2102中添加RTS和DTR的支持
期间,需要将一个byte的数组转换为int。
【折腾过程】
1.参考:
Converting from byte to int in java
去取数组index为0的即可:
1 2 3 | byte [] partNum = new byte []{ 0 }; ..... int gotPartNum = partNum[ 0 ]; |
【总结】
直接将(byte)数组的对应某个值(通过index取),赋值给int变量即可。
【后记】
1.后来遇到:
1 2 3 4 5 6 7 8 9 10 11 | //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 |
所以,继续研究,找到一个好的方式去转换。
去试试:
1 2 | //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.虽然工作,但是用起来很不方便,所以去写个函数,最终如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | //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