天天看點

LoRaWAN 中的Base64編碼

1.背景

LoRaWAN通信過程中,網關傳至伺服器端Json資料中data字段資料為經過編碼和加密的資料(應用資料)。編碼方式為Base64,加密方式為AES_128,具體加密方式可閱覽LoRaWAN協定。data資料如下

"data":"VEVTVF9QQUNLRVRfMTIzNA=="
           

題外話 Base64 是一種加密方式嗎???那是在很久很久以前我聽過Base64加密,Base64編碼,真是傻傻分不清楚,那是幾臉懵批呀。後來得一高僧指點(沒有頭發,應該是剃度了),有鑰匙才能開的那叫加密,沒鑰匙就能開的那是編碼。我想在了解了Base64原理之後每個人心裡都會有個結論。

2.原理

首先請大家看張表:

LoRaWAN 中的Base64編碼

我當時就在想為啥是Base64而不是Base120。看到這個表我的心靜了下來。

Base64編碼是基于上表64個字母進行編碼的(還有個=,嚴格來說是Base65)。Base64要求把 每三個8Bit的位元組轉換為四個6Bit的位元組 (3x8 = 4x6 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的位元組,也就是說,轉換後的字元串理論上将要比原來的長1/3。

這個64個字元可以通過0~63來表示,總共會占6b。

VEVTVF9QQUNLRVRfMTIzNA== 我們看下這串如何操作

  1. 在編碼表中尋找對應字元數值。比如V 21,E 4,T 19
    LoRaWAN 中的Base64編碼
  2. 轉二進制
    LoRaWAN 中的Base64編碼
    高兩位肯定是0啦
  3. 去掉高位兩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 是可逆的,咋整過來就可以咋整過去。在編解碼的過程中注意編碼集問題。

撒揚娜拉

繼續閱讀