android16進制
❶ android 藍牙如何發送十六進制數據
與藍牙模塊通信最重要的地方就是數據的發送和接收,因為是底層的操作,所以更多是發送16進制數據。
進制轉換是我們程序員的必修課,屬於基本素質。這里需要的是將位元組數組轉化為16進制字元串,方法都是通用的:
[java] view plain
public static String bytesToHexString(byte[] bytes) {
String result = "";
for (int i = 0; i < bytes.length; i++) {
String hexString = Integer.toHexString(bytes[i] & 0xFF);
if (hexString.length() == 1) {
hexString = '0' + hexString;
}
result += hexString.toUpperCase();
}
return result;
}
接下來就是發送數據。
發送數據非常簡單,之前有關於藍牙編程的博文已經講到了,http://www.cnblogs.com/wenjiang/p/3200138.html,這里只講重要的一點:大容量位元組數組的發送。
我們需要發送64個位元組的數組,如果一次性發送過去,單片機那裡可能無法及時處理以致沒有任何回應,因為單片機那裡是設置了數據接收的延時時間。要想暢通的與藍牙模塊通信,考慮這個時間差非常重要。調整位元組的發送速率,就成為非常關鍵的一步。值得注意的是,數據的發送是非常快的,就是因為這樣才會導致單片機那裡無法及時處理,所以,每次發送後的延時是非常重要的。我們單片機那裡的延時是10毫秒,所以我們選擇發送完每個位元組後就延時10毫秒再發下個位元組。
[java] view plain
for (byte b : bytes) {
out.write(b);
Thread.sleep(10);
}
具體的延時時間和位元組發送速率得看單片機那裡程序的設置。
在使用InputStream的時候,必須注意,InputStream的讀取是阻塞的。這點在一般的情況下是不會影響到我們的程序,但是記住這個情況對於代碼的設計是非常重要的,尤其是在考慮用戶體驗的時候。
無參數的read()是每次只從流中讀取一個位元組,這種做法效率非常低,但是簡單,像是讀取整數值這種情況,使用read()就非常好,但如果是16進制字元串呢?使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,這樣一次就能讀取多個位元組。
如果是讀取多個位元組,我們常常使用InputStream.available()方法來獲取數據流中可讀位元組的個數。讀取本地數據的時候,該方法發揮得非常好,但如果是讀取非本地數據,就可能出現位元組遺漏的問題,像是要讀取100個位元組,可能就是90個,甚至是0個。
出現0個的情況就是單片機那邊沒有響應或者位元組還沒發送過來,這時我們就需要一個循環來保證我們能夠拿到數據:
[java] view plain
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] bytes = new byte[count];
in.read(bytes);
但像是上面的90個位元組的情況就是位元組遺漏。對於這種情況,解決方法也很簡單:
[java] view plain
byte[] bytes = new byte[count];
int readCount = 0; // 已經成功讀取的位元組的個數
while (readCount < count) {
readCount += in.read(bytes, readCount, count - readCount);
}
❷ 為什麽Android源碼中的常量用十六進製表示
只是表示習慣,計算機數據是二進制的。
一個16進制位表示0-15,二進制就是0b0000-0b1111,是4個bit位,兩個十六進制位正好表示一個位元組。
十六進制正好表示位元組數據,比較符合計算機專業人士的習慣。
所以一個int數通常是4位元組正好寫成0x00000000-0xFFFFFFFF。
格式上美觀,也符合專業習慣。其實和用十進制是一樣的。
類似的一個8進制只是2的3次方 0b000-0b111。
❸ Android 怎樣接收十六進制數據
發送消息之前轉碼為16進制
Java code
public static final String encodeHex(String msg) {
byte[] bytes = null;
try {
bytes = msg.getBytes("GBK");
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
StringBuffer buff = new StringBuffer(bytes.length * 4);
String b;
char a;
int n = 0;
int m = 0;
for (int i = 0; i < bytes.length; i++) {
b = Integer.toHexString(bytes[i]);
if (bytes[i] > 0) {
buff.append("00");
buff.append(b);
n = n + 1;
} else {
a = msg.charAt((i - n) / 2 + n);
m = a;
b = Integer.toHexString(m);
buff.append(b.substring(0, 4));
i = i + 1;
}
}
return buff.toString();
}
❹ android串口通信如何發送16進制給給下位機
已解決,發送串口幀數據時,對於16進制數據定義,直接用byte[]數組就行了,不需要用Array.fill函數;
❺ android 16進制數怎麼轉換成一個位元組的byte
兩位16進制數就是一個位元組。
如果高於2位則會舍棄,如果低於兩位的直接賦值即可。
❻ 為什麼android的R類要定義成16進制
用十六進製表示,並不完全;如 activity 類的定義 ;public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2 { private static final String TAG = "Activity"; private static final boolean DEBUG_LIFECYCLE = false; /** Standard activity result: operation canceled. */ public static final int RESULT_CANCELED = 0; /** Standard activity result: operation succeeded. */ public static final int RESULT_OK = -1;另外關於 十六進制的好處: 以下有個例子可供參考,希望有幫助:public interface Const { public static final int ALIGN_TOP = 1; public static final int ALIGN_VCENTER = ALIGN_TOP << 1; public static final int ALIGN_LEFT = ALIGN_TOP << 2; public static final int ALIGN_RIGHT = ALIGN_TOP << 3; public static final int ALIGN_HCENTER = ALIGN_TOP << 4; public static final int ALIGN_BOTTOM = ALIGN_TOP << 5; }對於 常量之間的關系可互相引用
❼ android字元串轉換成16進制怎麼轉
android字元串轉換成16進制,參考如下內容:
/**
* 字元串轉換成十六進制字元串
* @param String str 待轉換的ASCII字元串
* @return String 每個Byte之間空格分隔,如: [61 6C 6B]
*/
public static String str2HexStr(String str)
{
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++)
{
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
sb.append(' ');
}
return sb.toString().trim();
}
❽ android代碼怎麼控制16進制的顏色值
它的代碼是#後面是16進制的RGB
例:
紅色#FF0000可以拆分為FF,00,00;轉換為10進制為255,0,0
綠色#00FF00可以拆分為00,FF,00;轉換為10進制為0,255,0
等
❾ android如何將字元串轉換成16進制數
Integer.parseInt(String, 16);
❿ Android socket 獲得16進制數據
mDataOutputClient = new DataOutputStream(mSocketClient.getOutputStream());
//發送
mDataOutputClient.write(0XFF);
mDataOutputClient.flush();
//接收
DataInputStream dis = new DataInputStream(mSocketClient.getInputStream());
int r=dis.readInt(); //接收int
接收十六進制。==> byte r=dis.readByte();
發送十六進制。==> byte r= (byte) 0xFF; dos.writeByte(r);
BufferedReader不推薦使用,因為不適合。