1.背景
LoRaWAN通信過程中,網關傳至伺服器端Json資料中data字段資料為經過編碼和加密的資料(應用資料)。編碼方式為Base64,加密方式為AES_128,具體加密方式可閱覽LoRaWAN協定。data資料如下
"data":"VEVTVF9QQUNLRVRfMTIzNA=="
題外話 Base64 是一種加密方式嗎???那是在很久很久以前我聽過Base64加密,Base64編碼,真是傻傻分不清楚,那是幾臉懵批呀。後來得一高僧指點(沒有頭發,應該是剃度了),有鑰匙才能開的那叫加密,沒鑰匙就能開的那是編碼。我想在了解了Base64原理之後每個人心裡都會有個結論。
2.原理
首先請大家看張表:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLzkERNRTQE1ENNpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL1UzN3QjN0kDM1AzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我當時就在想為啥是Base64而不是Base120。看到這個表我的心靜了下來。
Base64編碼是基于上表64個字母進行編碼的(還有個=,嚴格來說是Base65)。Base64要求把 每三個8Bit的位元組轉換為四個6Bit的位元組 (3x8 = 4x6 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的位元組,也就是說,轉換後的字元串理論上将要比原來的長1/3。
這個64個字元可以通過0~63來表示,總共會占6b。
VEVTVF9QQUNLRVRfMTIzNA== 我們看下這串如何操作
- 在編碼表中尋找對應字元數值。比如V 21,E 4,T 19
LoRaWAN 中的Base64編碼 - 轉二進制 高兩位肯定是0啦
LoRaWAN 中的Base64編碼 - 去掉高位兩0,重排(這個才是Base64的核心)
LoRaWAN 中的Base64編碼 下邊那欄就是你想要的資料。
完美吧!
不好意思,還有個 = 沒唠清楚,等号隻會出現在末尾處,是補零的産物,請在上述第二步驟中以0000 0000替代。
3.代碼咋整
在Java實作有:commons-codec.jar 和 sun.misc.BASE64Encoder
public void decoder(){
String base64String="VEVTVF9QQUNLRVRfMTIzNA==";
BASE64Decoder base64Decoder = new BASE64Decoder();
try {
base64Decoder.decodeBuffer(base64String);
} catch (IOException e) {
e.printStackTrace();
}
byte[] result = Base64.encodeBase64(base64String.getBytes());
}
注:Base64 是可逆的,咋整過來就可以咋整過去。在編解碼的過程中注意編碼集問題。
撒揚娜拉