java,arduino,C#之间的一些编码转换
1.C#-> Encoding.UTF8.GetBytes( "abc中") ->[97,98,99,228,184,173]
java->byte[] bs= "abc中".getBytes("Utf-8");[97,98,99,-28,-72,-83]
因为 java里的byte是 -128 到 127 ,所以java中的字节数组为负 -28的原码表示跟228是一样的(二进制)
//-----------------------------------------------------------
2.在ardunio针对char,跟 byte做(String)转换结果是不一样的,擦考如下代码,与输出
Serial.begin(9600); delay(100); Serial.println("Ready!"); byte bdata=247; char cdata=(char)bdata; String sb=(String)bdata; String sc=(String)cdata; Serial.println(sb.length()); Serial.println(sc.length()); Serial.println(sb.charAt(0),DEC); Serial.println((byte)sc.charAt(0),DEC);
上面代码的输出
3
1
50, 247 -> "247", charAt(0)=“2” ,'2'的ASCII是50
247 ,char转换成String后将保留原值
另外
byte bArr[4]={0,1,1,0};
String t="";
for(int i=0;i<4;i++){
t +=(String) bArr[i];
}
Serial.println(t.length(),DEC);
结果为2,即字节数组里的0被忽略了
//-------------------------------------------------------------
3.ardunio 中 byte 是0-255, char是-128到127
char c=-18;
byte t=(byte)c;
Serial.println(t,DEC);
将输出238,类似上面的问题1.
下面的是一组等价代码:
void reply(bool isOk,String cmd,String msg){ String rStr=""; if(isOk){ rStr="$FOK-" + cmd +":" +msg +"$E"; mySerial.println("AT+CIPSEND=0," + (String)rStr.length()); delay(10); mySerial.println(rStr); }else{ rStr="$FEE-" + cmd +":" +msg +"$E"; mySerial.println("AT+CIPSEND=0," + (String)rStr.length()); delay(10); mySerial.println(rStr); } } //------------------------- byte bs[4]; long2byte(123456789UL,bs); String msg= (String)((char)bs[0]) +(String)((char)bs[1]) +(String)((char)bs[2]) +(String)((char)bs[3]) ; reply(true,"HB",msg); // String rpStr="$FOK-HB:1234$E"; // mySerial.println("AT+CIPSEND=0," + (String)rpStr.length()); // delay(10); // mySerial.print("$FOK-HB:"); // mySerial.write(bs[0]); // mySerial.write(bs[1]); // mySerial.write(bs[2]); // mySerial.write(bs[3]); // mySerial.println("$E");