核心: String和Byte間的相互轉(zhuǎn)換
幾行代碼,教你最簡(jiǎn)單的轉(zhuǎn)換, 然鵝,在實(shí)際應(yīng)用過(guò)程中,數(shù)據(jù)的復(fù)雜性不只是我們簡(jiǎn)單的兩句話就可以轉(zhuǎn)換了的.那么就來(lái)看一下我昨天遇到的問(wèn)題
需求: 和硬件交互,發(fā)過(guò)來(lái)的報(bào)文是byte[]格式, 一個(gè)byte[]中包含了幾條信息,所以我本地要去根據(jù)制定的相關(guān)協(xié)議去解析.
問(wèn)題: 傳來(lái)的byte[]中, 每個(gè)信息長(zhǎng)度所占字節(jié)是我們協(xié)議預(yù)先設(shè)置好的, 但是在實(shí)際用的過(guò)程中因?yàn)樽址L(zhǎng)短不一, 所以傳過(guò)來(lái)雖然字節(jié)長(zhǎng)度固定,但是可用字節(jié)是無(wú)法獲取的. 這樣一來(lái),直接用new String();轉(zhuǎn)換,會(huì)出現(xiàn)如下異常
可以看到,在我們的有效字符后全是亂碼, 造成的原因是什么呢?
就是在協(xié)議的 byte[]中該字符最長(zhǎng)占36個(gè)字節(jié). 但實(shí)際該字符占20個(gè)字節(jié), 這樣不足位就會(huì)補(bǔ)0 ,也就是所說(shuō)的\0結(jié)束符. 直到補(bǔ)夠36個(gè)字節(jié). 我循環(huán)打印了一下我收到的byte[], 可以看一下
后面的0就是造成上述亂碼的原因.
解決:
1.熟悉C的人應(yīng)該覺(jué)得這不是什么難事,因?yàn)镃中提供了一個(gè)函數(shù): strcpy. 可以吧從src地址開始且含有'\0'結(jié)束符的字符串復(fù)制到以dest開始的地址空間.(此函數(shù)和圖3中System.arraycopy函數(shù)類似. 不懂的自行百度. 本文不做過(guò)多介紹).
簡(jiǎn)單的來(lái)說(shuō)就是, C中通過(guò)strcpy函數(shù)可以自動(dòng)復(fù)制有結(jié)束符之前的內(nèi)容. 但是,我的開發(fā)環(huán)境是android.所以此路行不通.
2.因?yàn)榇蛴〕鰜?lái)直觀看到的就是0. java中 String提供了個(gè)api是 replace. 那可以直接用replace將0替換成其他內(nèi)容. 我們來(lái)試一下;
這樣, 后面的亂碼問(wèn)題就解決了. 但是因?yàn)槭菍0替換成了空格字符,所以后面還有占位,下面就需要用到trim()函數(shù).就可以解決了
簡(jiǎn)單的概括一下就是: 1.替換 2.去空格
3.既然知道了問(wèn)題的所在, 那么解決的方法就有很多種. 下面再說(shuō)一種.
用indexOf('\0'); 函數(shù)找出第一個(gè)出現(xiàn)結(jié)束符的下標(biāo), 然后用substring();截取字符就ok了
簡(jiǎn)單的概括一下就是: 1.找到下標(biāo) 2.截取字符
至此, 所有問(wèn)題完美解決.
因?yàn)楹陀布慕换ナ遣粩嗟?今后可能也會(huì)再遇到類似問(wèn)題,所以寫篇文章記錄一下.可以隨時(shí)查閱.
寫文章的時(shí)候就是又復(fù)習(xí)了一遍, 日后查閱印象也會(huì)更加深刻.好習(xí)慣要保持下去.