天天看点

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 是可逆的,咋整过来就可以咋整过去。在编解码的过程中注意编码集问题。

撒扬娜拉

继续阅读