0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

什么是base64?

汽車電子技術 ? 來源:嵌入式大雜燴 ? 作者:ZhengNL ? 2023-02-09 16:34 ? 次閱讀

大家好,我是雜燴君。

嵌入式大雜燴周記主要是一些實用項目學習分享,每篇一個主題。

內(nèi)容主要來源于我們之前收集的資料

https://gitee.com/zhengnianli/EmbedSummary

本期主角:base64

在我們嵌入式開發(fā)中,我們常常都會用到一些通用的工具庫,往往都會有個base64編解碼模塊。

base64編解碼模塊有什么用?

Base64就是一種基于64個可打印字符來表示二進制數(shù)據(jù)的方法,網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一。

比如,如果一個傳輸協(xié)議是基于ASCII文本的,那么它就不能傳輸二進制流,那你要將二進制流傳輸就得編碼,因為有些8Bit字節(jié)碼并沒有對應的ASCII字符。

比如,我之前也沒了解過base64。某個項目中在調(diào)試設備、云端、手機APP之前的通信時,設備端給手機端傳一些8Bit字節(jié)碼數(shù)據(jù),手機端并未解析得到正確的數(shù)據(jù),后來查了資料才知道需要進行base64編碼,需要使用base64來屏蔽傳輸上的差異。后來,給數(shù)據(jù)套了一層base64之后,就正常了。

實際中,設備、云端、手機APP交互數(shù)據(jù)常常這么做:

設備端把base64編碼后的數(shù)據(jù)封裝在json字符串里,手機端先解析json拿到value,再進行base64解碼拿到想要的數(shù)據(jù)。

注意:雖然編碼之后的數(shù)據(jù)與加密一樣都具有不可見性,但編碼與加密的概念并不一樣。編碼是公開的,任何人都可以解碼;而加密則相反,你只希望自己或者特定的人才可以對內(nèi)容進行解密。

base64編解碼庫網(wǎng)絡上有很多,這里分享一份:

https://blog.csdn.net/qq_15762939/article/details/110202212

base64編解碼測試

1、base64基本原理

Base64是基于64個可打印字符來表示二進制數(shù)據(jù)的編解碼方式,每個字符對應一個索引,對應關系表如:

圖片

一個Base64字符實際上代表著6個二進制位(bit),4個Base64字符對應3字節(jié)字符串/二進制數(shù)據(jù)。

3個字符為一組的的base64編碼方式如:

圖片

小于3個字符為一組的編碼方式如:

圖片

2、base64測試

我們對如下三種數(shù)據(jù)進行編解碼測試:

  • "hello world abcdefg"
  • "hello ,,,,,,,,, world"
  • {0x81, 0x82, 0x83, 0x84}

測試代碼:

// 微信公眾號:嵌入式大雜燴
#include 
#include 
#include 

/* Base64編碼映射表 */
const char *const Base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int Base64Encode(const unsigned char *Bindata, int Binlen, char *const Base64Buf);
int Base64Decode(const char *Base64Buf, unsigned char *const Bindata);

int main(int argc, char **argv)
{
    unsigned char base64_buf[128] = {0};
    unsigned char bin_buf[128] = {0};
    int base64_len = 0;
    int bin_len = 0;

    printf("\\n=================================test1==========================================\\n");
    char *test_data1 = "hello world abcdefg";

    printf("src data str = %s, src_data_len = %ld\\n", test_data1, strlen(test_data1));
    memset(base64_buf, 0x00, sizeof(base64_buf));
    memset(bin_buf, 0x00, sizeof(bin_buf));
    base64_len = Base64Encode(test_data1, strlen(test_data1), base64_buf);
    printf("after base64_encode, base64_buf = %s, base64_len = %d\\n", base64_buf, base64_len);
    bin_len = Base64Decode(base64_buf, bin_buf);
    printf("after base64_decode bin_buf = %s, bin_len = %d\\r\\n", bin_buf, bin_len);

    printf("\\n=================================test2==========================================\\n");
    char *test_data2 = "hello ,,,,,,,,, world";

    printf("src data str = %s, src_data_len = %ld\\n", test_data2, strlen(test_data2));
    memset(base64_buf, 0x00, sizeof(base64_buf));
    memset(bin_buf, 0x00, sizeof(bin_buf));
    base64_len = Base64Encode(test_data2, strlen(test_data2), base64_buf);
    printf("after base64_encode, base64_buf = %s, base64_len = %d\\n", base64_buf, base64_len);
    bin_len = Base64Decode(base64_buf, bin_buf);
    printf("after base64_decode bin_buf = %s, bin_len = %d\\r\\n", bin_buf, bin_len);

    printf("\\n=================================test3==========================================\\n");
    unsigned char test_data3[4] = {0x81, 0x82, 0x83, 0x84};

    printf("src data hex = ");
    for (int i = 0; i < sizeof(test_data3); i++)
    {
        printf("%#02x ", test_data3[i]);
    }
    printf("   src_data_len = %ld\\n", sizeof(test_data3));
    memset(base64_buf, 0x00, sizeof(base64_buf));
    memset(bin_buf, 0x00, sizeof(bin_buf));
    base64_len = Base64Encode(test_data3, sizeof(test_data3), base64_buf);
    printf("after base64_encode, base64_buf = %s, base64_len = %d\\n", base64_buf, base64_len);
    bin_len = Base64Decode(base64_buf, bin_buf);

    printf("after base64_decode, data hex = ");
    for (int i = 0; i < bin_len; i++)
    {
        printf("%#02x ", bin_buf[i]);
    }
    printf("   bin_len = %d\\n", bin_len);
    printf("\\n");

    return 0;
}

/******************************************************** 
 *功能描述:Base64編碼
 *輸入參數(shù): Bindata:原始bin數(shù)據(jù)
    Binlen:原始 bin數(shù)據(jù)長度
 *輸出參數(shù):Base64Buf:base64編碼數(shù)據(jù)
 *返 回 值:base64編碼后數(shù)據(jù)長度
*********************************************************/
int Base64Encode(const unsigned char *Bindata, int Binlen, char *const Base64Buf)
{
    unsigned char s8CharIndex = 0;
    int i=0, Len=0;

    for ((i=0,Len=0); i3)
    {
        s8CharIndex = (Bindata[i]>>2);
        s8CharIndex &= (unsigned char)0x3F;
        Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
        s8CharIndex = ((unsigned char)(Bindata[i]<<4)) & ((unsigned char)0x30);
        if ((i+1) >= Binlen)
        {
            Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
            Base64Buf[Len++] = '=';
            Base64Buf[Len++] = '=';
            break;
        }

        s8CharIndex |= ((unsigned char)(Bindata[i+1]>>4)) & ((unsigned char)0x0F);
        Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
        s8CharIndex = ((unsigned char)(Bindata[i+1]<<2)) & ((unsigned char)0x3C);
        if ((i+2) >= Binlen)
        {
            Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
            Base64Buf[Len++] = '=';
            break;
        }

        s8CharIndex |= ((unsigned char)(Bindata[i+2]>>6) & ((unsigned char)0x03));
        Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
        s8CharIndex = ((unsigned char)Bindata[i+2]) & ((unsigned char)0x3F) ;
        Base64Buf[Len++] = Base64Table[(int)s8CharIndex];
    }

    return Len;
}  

/******************************************************** 
 *功能描述:Base64解碼
 *輸入?yún)?shù): Base64Buf:base64編碼數(shù)據(jù)
 *輸出參數(shù):Bindata:解碼后bin數(shù)據(jù)
 *返 回 值:解碼后bin數(shù)據(jù)長度
*********************************************************/
int Base64Decode(const char *Base64Buf, unsigned char *const Bindata)
{
    int i, Len=0;
    unsigned char s8CharIndex = 0;
    unsigned char temp[4] = {0};
    for ((i=0,Len=0); Base64Buf[i]!='\\0'; i+=4)
    {
        memset(temp, 0xFF, sizeof(temp));
        for (s8CharIndex=0; s8CharIndex<64; s8CharIndex++)
        {
            if (Base64Table[s8CharIndex] == Base64Buf[i])
                temp[0]= s8CharIndex;
        }

        for (s8CharIndex=0; s8CharIndex<64; s8CharIndex++)
        {
            if (Base64Table[s8CharIndex] == Base64Buf[i+1])
                temp[1]= s8CharIndex;
        }

        for (s8CharIndex=0; s8CharIndex<64; s8CharIndex++)
        {
            if (Base64Table[s8CharIndex] == Base64Buf[i+2])
                temp[2]= s8CharIndex;
        }

        for (s8CharIndex=0; s8CharIndex<64; s8CharIndex++)
        {
            if (Base64Table[s8CharIndex] == Base64Buf[i+3])
                temp[3]= s8CharIndex;
        }

        if ((0xFF==temp[0]) || (0xFF==temp[1]) || (0xFF==temp[2]) || (0xFF==temp[3]))
        {
            //printf("(%s:%d) already decode base64 Len:%d\\r\\n", __func__, __LINE__, i);
            //break;//考慮到有些base64是經(jīng)過變異的,不做退出處理
        }

        Bindata[Len++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
        ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
        if (Base64Buf[i+2] == '=')
        {
            printf("(%s:%d) already decode base64 Len:%d\\r\\n", __func__, __LINE__, i);
            break;
        }

        Bindata[Len++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
        ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
        if (Base64Buf[i+3] == '=')
        {
            printf("(%s:%d) already decode base64 Len:%d\\r\\n", __func__, __LINE__, i);
            break;
        }

        Bindata[Len++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
        ((unsigned char)(temp[3]&0x3F));
    }

    return Len;
}

運行:

圖片

以上就是本次的分享。

如果覺得文章有幫助,麻煩幫忙點贊、收藏、轉(zhuǎn)發(fā),謝謝!

咱們下期見~

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編解碼
    +關注

    關注

    1

    文章

    140

    瀏覽量

    19579
  • 嵌入式開發(fā)

    關注

    18

    文章

    1018

    瀏覽量

    47470
  • Base64
    +關注

    關注

    0

    文章

    24

    瀏覽量

    8797
收藏 人收藏

    評論

    相關推薦

    使用base64存儲圖片的優(yōu)勢與劣勢

    優(yōu)勢 兼容性和跨平臺性 : Base64編碼的字符串是純文本格式,這意味著它們可以在任何支持ASCII文本的環(huán)境中使用,包括不同的操作系統(tǒng)和編程語言。這種跨平臺性使得Base64編碼的圖片可以輕松
    的頭像 發(fā)表于 11-10 14:25 ?286次閱讀

    base64在前端開發(fā)中的應用

    Base64是一種編碼方法,用于將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串。這種編碼方式在前端開發(fā)中有著廣泛的應用,尤其是在數(shù)據(jù)傳輸和存儲方面。 1. Base64編碼的基本概念 Base64編碼是一種
    的頭像 發(fā)表于 11-10 14:24 ?304次閱讀

    如何優(yōu)化base64編碼的性能

    Base64編碼是一種廣泛使用的編碼方法,用于將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串。它在許多場景中非常有用,例如在電子郵件、網(wǎng)頁和存儲系統(tǒng)中傳輸二進制數(shù)據(jù)。然而,Base64編碼和解碼可能會對性能
    的頭像 發(fā)表于 11-10 14:17 ?268次閱讀

    base64與URL編碼的區(qū)別和聯(lián)系

    在數(shù)字時代,數(shù)據(jù)的傳輸和存儲變得尤為重要。為了確保數(shù)據(jù)在不同系統(tǒng)和平臺之間能夠正確、安全地傳輸,我們需要對數(shù)據(jù)進行編碼。Base64和URL編碼是兩種廣泛使用的編碼技術,它們各自有不同的應用場
    的頭像 發(fā)表于 11-10 11:11 ?172次閱讀

    base64在Web開發(fā)中的作用

    在Web開發(fā)中,數(shù)據(jù)的傳輸和存儲是核心任務之一。然而,并非所有數(shù)據(jù)都可以直接在Web環(huán)境中高效傳輸。例如,二進制數(shù)據(jù)(如圖片、音頻和視頻)在HTTP協(xié)議中傳輸時可能會遇到問題。Base64編碼作為
    的頭像 發(fā)表于 11-10 11:07 ?158次閱讀

    base64的安全性及其應用場景

    Base64是一種編碼方法,用于將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串。它廣泛應用于網(wǎng)絡傳輸、數(shù)據(jù)存儲和文件編碼等領域。然而,Base64編碼并不是一種加密方法,因此其安全性有限。 1. Base64
    的頭像 發(fā)表于 11-10 10:59 ?167次閱讀

    base64字符串轉(zhuǎn)換為二進制文件

    Base64是一種編碼方法,用于將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串。這種編碼通常用于在不支持二進制數(shù)據(jù)的系統(tǒng)中傳輸數(shù)據(jù),例如電子郵件或網(wǎng)頁。將Base64字符串轉(zhuǎn)換為二進制文件的過程相對簡單,但需要
    的頭像 發(fā)表于 11-10 10:55 ?104次閱讀

    如何使用base64處理圖像數(shù)據(jù)

    Base64是一種編碼方法,可以將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符集的文本格式。這種編碼方式常用于在不支持二進制數(shù)據(jù)的系統(tǒng)之間傳輸圖像數(shù)據(jù),例如在電子郵件、網(wǎng)頁或配置文件中。 1. 理解Base64
    的頭像 發(fā)表于 11-10 10:51 ?182次閱讀

    base64在數(shù)據(jù)傳輸中的應用實例

    們轉(zhuǎn)換成文本格式。 Base64編碼原理 Base64編碼是一種二進制到文本的編碼方法,它將每3個字節(jié)的二進制數(shù)據(jù)編碼為4個ASCII字符。這種編碼方式確保了編碼后的數(shù)據(jù)只包含ASCII字符集中的字符,從而可以安全地在各種文本格式中傳輸。 應用場景 1. 電子郵
    的頭像 發(fā)表于 11-10 10:50 ?170次閱讀

    base64編碼和解碼的使用方法

    Base64編碼是一種廣泛使用的編碼方案,用于將二進制數(shù)據(jù)轉(zhuǎn)換為純文本格式。這種編碼方式特別適用于在不支持二進制數(shù)據(jù)的系統(tǒng)之間傳輸數(shù)據(jù),例如電子郵件、網(wǎng)頁等。 1. Base64編碼簡介
    的頭像 發(fā)表于 11-10 10:48 ?179次閱讀

    鴻蒙語言基礎類庫:ohos.util util工具函數(shù)

    該模塊主要提供常用的工具函數(shù),實現(xiàn)字符串編解碼(TextEncoder,TextDecoder)、有理數(shù)運算(RationalNumber)、緩沖區(qū)管理(LruBuffer)、范圍判斷(Scope)、Base64編解碼(Base64)、內(nèi)置對象類型檢查(Types)等功能
    的頭像 發(fā)表于 07-09 16:56 ?433次閱讀
    鴻蒙語言基礎類庫:ohos.util util工具函數(shù)

    請問esp32如何將16進制字符串轉(zhuǎn)換成base64格式?

    請問 esp32 如何將 16進制字符串轉(zhuǎn)換成base64格式
    發(fā)表于 06-24 08:35

    labview把圖片轉(zhuǎn)成base64

    各位大佬們,請教一下如何在labview中把圖片轉(zhuǎn)成base64編碼,然后傳給Python,或者是然后用labview和Python之間傳遞圖片,求大神指教該怎么寫
    發(fā)表于 05-08 01:04

    什么是Base64,如何編解碼?

    Base64編碼的原理是將輸入數(shù)據(jù)分割成固定長度的塊(通常是3個字節(jié)),然后將每個塊轉(zhuǎn)換為4個Base64字符。這四個字符由64個特定的ASCII字符組成,包括大寫字母A-Z、小寫字母a-z、數(shù)字0-9以及兩個額外的字符+/。編
    發(fā)表于 05-03 17:36 ?584次閱讀

    鴻蒙OS開發(fā)問題:(ArkTS) 【解決中文亂碼 string2Uint8Array、uint8Array2String】

    在進行base64編碼中,遇到中文如果不進行處理一定會出現(xiàn)亂碼
    的頭像 發(fā)表于 03-27 21:38 ?1868次閱讀
    鴻蒙OS開發(fā)問題:(ArkTS) 【解決中文亂碼 string2Uint8Array、uint8Array2String】