探索結構體的奧秘

目錄

🍂結構體

1,結構體的聲明

1.1 結構的基礎知識

1.2 結構的聲明

1.3 特殊的聲明

1.4 結構的自引用

1.5 結構體變量的定義和初始化

1.6 結構體內存對齊

1.6.1 如何計算

1.6.2 為什么存在內存對齊?

1.7 修改默認對齊數

1.8 結構體傳參

2,位段

2.1 什么是位段

2.2 位段的內存分配

2.3 位段的跨平臺問題

2.4 位段的應用

3,枚舉

3.1 枚舉類型的定義

3.2 枚舉的優點

3.3 枚舉的使用

4,聯合(共用體)

4.1 聯合類型的定義

4.2 聯合的特點

4.3 聯合大小的計算


🍂結構體

1,結構體的聲明

1.1 結構的基礎知識

結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。

1.2 結構的聲明

struct tag//struct是結構體關鍵字,不能省略、tag是自己設定的
{member_list;//成員列表,可以有一個,也可以有多個
}variable_list;//變量列表(可有可無)

?🍁例如描述一個學生:

struct Student
{char name[20];//姓名int age;//年齡char sex[5];//性別float score;//學號
}s1, s2, s3;//s1,s2,s3是三個結構體變量 - 全局變量int main()
{struct Student s4, s5, s6;//s4,s5,s6也是三個結構體變量 - 局部變量return 0;
}

1.3 特殊的聲明

?🍁在聲明結構體的時候,可以不完全的聲明,即匿名結構體類型。

//匿名結構體類型
struct
{char name[20];//姓名char author[12];//作者float price;//價格
}b;struct
{char name[20];//姓名char author[12];//作者float price;//價格
}*p;

上面的兩個結構在聲明的時候省略掉了結構體標簽(tag),我們就叫稱它為匿名結構體類型。

那么問題來了?

//在上面代碼的基礎上,下面的代碼合法嗎?
p = &b;

答案是不合法的。雖然它們的成員看起來都一樣,但是編譯器依然認為這是兩種結構體類型。所以當要把b的地址取出來放在p變量里邊去的時候,編譯器會認為等號兩邊的類型是不一樣的。

1.4 結構的自引用

在結構中包含一個類型為該結構本身的成員就叫結構體的自引用,那我們該怎么寫代碼呢?

struct Node
{int date;struct Node n;
};

這樣寫可以嗎?如果可以,那sizeof(struct Node)是多少呢?

這種寫法是錯誤的,因為date 占4個字節,而n就會占4+n個字節,4+n里邊的n又會占4+n個字節,這樣無休止的下去,編譯器都會崩潰的。

🍁正確的自引用方式如下:

struct Node
{int date;//存放數據 - 數據域struct Node* n;//存放下一個節點的地址 - 指針域
};

🍁打印結果:


🍁那像這樣寫代碼可不可以呢??

typedef struct
{int date;Node* n;
}Node;

?上面這段代碼給匿名的結構體類型起名為Node,但現在這個Node還沒有產生呢,結構體里邊就想用Node,這就相當于先有雞還是先有蛋的問題,所以這樣寫代碼是錯誤的。

🍁正確寫法如下:?

typedef struct Node
{int date;struct Node* n;
}Node;

1.5 結構體變量的定義和初始化

🍁有了結構體類型,那如何定義變量呢,其實很簡單。

#include <stdio.h>struct Point
{int x;int y;
}p1;//聲明類型的同時定義變量p1struct Point p2;//定義結構體變量p2struct Point p3 = { 4, 5 };//初始化:定義變量的同時賦初值。struct stu//類型聲明
{char name[20];//姓名int age;//年齡
};//結構體嵌套
struct Node
{int data;struct Point p;struct Node* next;
};int main()
{int a = 10;int b = 20;struct Point p4 = { a, b };struct stu s = { "zhangsan", 20 };//順序初始化struct stu s2 = { .age = 18, .name = "lisi" };//亂序初始化printf("%s %d\n", s.name, s.age);printf("%s %d\n", s2.name, s2.age);struct Node n = { 100, {10, 20}, NULL };printf("%d x=%d y=%d\n", n.data, n.p.x, n.p.y);return 0;
}

1.6 結構體內存對齊

🍁接下來我們深入討論一個問題:計算結構體的大小,先看代碼:

#include <stdio.h>struct s1
{char c1;int i;char c2;
};struct  s2
{char c1;char c2;int i;
};int main()
{printf("%d\n", sizeof(struct s1));printf("%d\n", sizeof(struct s2));return 0;
}

?🎈運行結果:

我們可以看到上邊代碼運行后第一個的結果為12個字節,第二個為8個字節,但是我們兩個結構體的成員一摸一樣,只是它們成員的順序不同,運行出來的結果就差了4個字節,這是為什么呢?這里我們要先介紹一個宏?--- offsetof。?


🌴offsetof 宏:

offsetof是C語言中的一個宏,它用于計算結構體成員相較于起始位置的偏移量。

offsetof宏的定義:?

#define offsetof(type, member)
  • 這個宏接收兩個參數:
  • type:結構體的類型
  • member:結構體中的成員名
  • offsetof宏返回一個size_t類型的值,表示member在type結構體中的偏移量。?

示例:?

#include <stdio.h>
#include <stddef.h>struct Mystruct
{int a;char b;double c;
};int main()
{size_t offset = offsetof(struct Mystruct, b);printf("%zd\n", offset);return 0;
}

??🎈運行結果:

在這個示例中,offsetof宏計算了結構體Mystruct中成員b的偏移量,并輸出到控制臺。?


🍂接下來我們探究一下偏移量:?

🍂 下面我們可以用offsetof宏分別計算一下結構體s1和s2中成員的偏移量:

?



1.6.1 如何計算

🌴有了上邊知識的鋪墊后,接下來我們再來學習一下該如何計算結構體的大小,首先得掌握結構體的對齊規則:

我們以 struct s1 為例:

struct s1
{char c1;//偏移量為0int i;//偏移量為4char c2;//偏移量為8
};

1,第一個成員在與結構體變量偏移量為0的地址處。

2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。對齊數 = 編譯器默認的一個對齊數該成員大小較小值,VS中默認的值為8。Linux中沒有默認對齊數,對齊數就是成員自身的大小。

?3. 結構體總大小為最大對齊數(每個成員變量都有一個對齊數)的整數倍。

在s1結構體里邊,c1的對齊數為1、c2的對齊數為1、i的對齊數為4,那三個成員里邊最大對齊數就是4,我們說結構體總大小為最大對齊數的整數倍,而我們剛才計算的這個結構體的總大小為8,剛好是4的整數倍。這就是計算結構體總大小的方法。

4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整
體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。

🌴計算struct S2結構體的總大小:

struct S1
{char c1;int i;char c2;
};struct  S2
{char c1;struct S1 s1;int i;
};

?

1.6.2 為什么存在內存對齊?

1,平臺原因(移植原因):

不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。

2,性能原因:

數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。
原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

🎈總的來說:結構體的內存對齊是拿空間來換取時間的做法。

那在設計結構體的時候,我們既要滿足對齊,又要節省空間,該如何做到呢:
其實很簡單,那就是讓占用空間小的成員盡量集中在一起

//例如:
struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};

S1和S2類型的成員一模一樣,但是S1和S2所占空間的大小卻有區別。

1.7 修改默認對齊數

在前面的學習中我們說在VS中默認對齊數為8,而Linux環境下沒有默認對齊數。那這個默認對齊數可不可以修改呢,其實是可以的,用#pragma 這個預處理指令就可以修改我們的默認對其數。

#include <stdio.h>#pragma pack(8)//設置默認對齊數為8
struct S1
{char c1;int i;char c2;
};
#pragma pack()//取消設置的默認對齊數,還原為默認#pragma pack(1)//設置默認對齊數為1
struct S2
{char c1;char c2;int i;
};
#pragma pack()//取消設置的默認對齊數,還原為默認int main()
{//輸出的結果是什么?printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));return 0;
}

🍂 運行結果:

從上面這個代碼示例我們可以得出一個結論:結構體在對齊方式不合適的時候,我們可以自己更改默認對齊數。?

1.8 結構體傳參

先看一段代碼:

struct S 
{int date[1000];int num;
};//結構體傳參
void print1(struct S t)
{printf("%d %d %d %d %d\n", t.date[0], t.date[1], t.date[2], t.date[3], t.num);
}
//結構體地址傳參
void print2(struct S *ps)
{printf("%d %d %d %d %d\n", ps->date[0], ps->date[1], ps->date[2], ps->date[3], ps->num);
}int main()
{struct S s = { {1,2,3,4}, 1000 };print1(s);//傳值調用print2(&s);//傳址調用return 0;
}

🍂上面的 print1 和 print2 函數哪個好些呢?

答案是:首選print2函數。

🍂原因:

  • 函數傳參的時候,參數是需要壓棧,會有時間和空間上的系統開銷。
  • 如果傳遞一個結構體對象的時候,結構體過大,參數壓棧的的系統開銷比較大,所以會導致性能的下降。
  • 傳值調用是把s這個對象直接傳給了t,當實參傳給形參的時候,形參將是實參的一份臨時拷貝,形參也會創建一份獨立的變量,如果s這個結構體所占空間過大,當我們要傳給t的時候,t也要在內存里邊在開辟一塊和s一樣大的空間,這不就浪費了嗎。實參把數據給形參,會浪費時間;形參把數據放在空間里邊,又會浪費一塊獨立的空間,這就造成了時間和空間雙重浪費,所以說這種效率不夠高。
  • 傳址調用傳的是地址,一個地址的大小無非就是4或8個字節,在函數調用的過程中,壓棧的開銷就只有4個字節,它的效率就會高一些。

結論:

結構體傳參的時候,要傳結構體的地址。

2,位段

前面我們講,結構體會犧牲一部分空間,換來效率上的提升,它會浪費空間,而位段設計之初就是為了節省空間的。下面我們就來了解一下結構體實現位段的能力。

2.1 什么是位段

位段的聲明和結構是類似的,但有兩個不同:

  • 位段的成員必須是 int、unsigned int 或signed int 。在C99之后,也可以是其它類型,但是基本上都是int,char類型。
  • 位段的成員名后邊有一個冒號和一個數字。

例如:

//位段 -- 位是二進制位
struct A
{int _a : 2;//:2 代表占用2個bit位的空間int _b : 5;//:5 代表占用5個bit位的空間int _c : 10;//:10 代表占用10個bit位的空間int _d : 30;//:30 代表占用30個bit位的空間
};

在結構體創建的時候,有一些成員它的取值范圍可能會非常有限?,我們舉例來說:

struct A
{int _a;int _b;int _c;int _d;
};

假設-a這個成員的取值只能是0、1、2、3這幾個值,0的二進制為00;1的二進制位01;2的二級制位10;3的二進制為11,這時我們會發現只要兩個bit位就能把這4種情況全部表示出來,而如果我們沒有把它實現成位段的方式,而是直接定義成整型的話,1個整型是4個字節即32個bit位,32個bit位如果都給-a,但-a本質上只用2個bit位,那余下的30個bit位就會被浪費掉。基于這樣的情況,如果我們能夠知道一個結構體的某些成員它的取值范圍只是占了內存空間的一部分時,它好像用不了一個整型,那我們就可以指定它的位,這樣就可以很好的節省空間。

A就是一個位段類型,那位段A的大小是多少呢?

?上面我們用來舉例的結構體大小為16個字節,這是毋庸置疑的。我們通過位段A每個成員變量它所占的bit位可以大概猜測出它的大小為6個字節,而位段A的大小通過計算是8個字節,這樣一對比,就可以看出它比結構體節省了一半的空間。

2.2 位段的內存分配

  1. 位段的成員可以是 int 、unsigned int 、signed int 或者是 char (屬于整形家族)類型。
  2. ?位段的空間上是按照需要以4個字節( int )或者1個字節( char )的方式來開辟的。
  3. ?位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。

?🌴一個栗子:

//空間是如何開辟的?
#include <stdio.h>
struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;return 0;
}

?

2.3 位段的跨平臺問題

  1. int 位段被當成有符號數還是無符號數是不確定的。
  2. 位段中最大位的數目不能確定。(16位機器上整型的大小是2個字節 = 16bit位,32位機器上整型的大小是4個字節 = 32bit位),寫成27,在16位機器會出問題。
  3. ?位段中的成員在內存中從左向右分配,還是從右向左分配標準尚未定義。
  4. 當一個結構包含兩個位段,第二個位段成員比較大,無法容納于第一個位段剩余的位時,是舍棄剩余的位還是利用,這是不確定的。

總結:

跟結構相比,位段可以達到同樣的效果,并且可以很好的節省空間,但是有跨平臺的問題存在。

2.4 位段的應用

3,枚舉

枚舉顧名思義就是一一列舉的意思,把可能的取值一一列舉。

比如我們現實生活中:

一周的星期一到星期天是有限的7天,可以一一列舉出來;

性別有:男、女、保密,也可以一一列舉;

一年有12個月,也可以一一列舉。

這里就可以使用枚舉了。

3.1 枚舉類型的定義

enum Sex//性別
{//枚舉的可能取值MALE,//男FEMALE,//女SECRET//保密
};enum Color//顏色
{//枚舉常量RED,GREEN,BLUE
};

以上定義的 enum Sex , enum Color 都是枚舉類型。{ }中的內容是枚舉類型的可能取值,也叫枚舉常量,這些可能取值都是有值的,默認從0開始,依次遞增1。

int main()
{printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);enum Sex sex = SECRET;//賦值return 0;
}

當然在定義的時候也可以賦初值,例如:

enum Sex
{//枚舉的可能取值MALE = 1,FEMALE = 2,SECRET = 4
};

3.2 枚舉的優點

我們可以使用 #define 定義常量,為什么非要使用枚舉呢?

枚舉的優點:

  1. 增加代碼的可讀性和可維護性
  2. 和#define定義的標識符比較 枚舉有類型檢查,更加嚴謹。
  3. 便于調試
  4. 使用方便,一次可以定義多個常量

3.3 枚舉的使用

enum Color//顏色
{RED = 1,GREEN = 2,BLUE = 4
};
enum Color clr = GREEN;//只能拿枚舉常量給枚舉變量賦值,才不會出現類型的差異。
clr = 5; //編譯器更加嚴謹的時候可能會出現類型不匹配的問題

4,聯合(共用體)

4.1 聯合類型的定義

聯合也是一種特殊的自定義類型,這種類型定義的變量也包含一系列的成員,特征是這些成員共用同一塊空間(所以聯合也叫共用體)。

//聯合類型的聲明
union Un
{char c;int i;
};int main()
{union Un un;//聯合變量的定義printf("%d\n", sizeof(un));//計算聯合變量的大小return 0;
}

4.2 聯合的特點

聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)。

union Un
{int i;char c;
};// 下面輸出的結果是一樣的嗎?
int main()
{union Un un;printf("%p\n", &(un));printf("%p\n", &(un.i));printf("%p\n", &(un.c));return 0;
}

🍂運行結果:?


🌴面試題,判斷當前計算機的大小端存儲:?

#include <stdio.h>
int check_sys()
{union Un{int i;char c;}un;un.i = 1;return un.c;//返回1表示小端,返回0表示大端
}int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

4.3 聯合大小的計算

  • 聯合的大小至少是最大成員的大小。
  • 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
union Un1
{char c[5];//5int i;//4
};
union Un2
{short c[7];//14int i;//4
};int main()
{//下面輸出的結果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

?🍁運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162541.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.7寸墨水屏藍牙卡證

超薄機身&#xff0c;厚度不足一厘米&#xff0c;輕松佩戴無負重感。 無需基站&#xff0c;服務器&#xff0c;手機APP直接更新~ 獨創快速掃描技術&#xff0c;智能感應標簽 超長待機&#xff0c;超低功耗&#xff0c;Type C接口充電&#xff0c;一次充電可續航一年&#xf…

極智開發 | 隨機初始化onnx模型權重的方法

歡迎關注我的公眾號 [極智視界],獲取我的更多經驗分享 大家好,我是極智視界,本文分享一下 隨機初始化onnx模型權重的方法。 邀您加入我的知識星球「極智視界」,星球內有超多好玩的項目實戰源碼和資源下載,鏈接:https://t.zsxq.com/0aiNxERDq onnx 模型一直是在算法部署中…

增量有余、后勁不足,星途汽車10月份銷量環比下降3.9%

撰稿|行星 來源|貝多財經 近日&#xff0c;奇瑞集團發布了10月銷量月報。報告顯示&#xff0c;奇瑞集團于2023年10月銷售汽車20.03萬輛&#xff0c;同比增長50.8%&#xff0c;單月銷量首次突破20萬輛&#xff1b;2023年前10個月的累計銷量為145.36輛&#xff0c;同比增長41.6…

C語言運算符詳解

詳細介紹了C語言表達式、算術運算符、賦值運算符、關系運算符、條件結構、邏輯運算符、位運算符的語法和使用方法&#xff0c;并討論了運算符的優先級。 1、表達式與算術運算符 在C語言中&#xff0c;表達式是一個類似數學中的算式&#xff0c;表達式由變量、字面值、常量、運…

【坑】JDK21虛擬線程不支持run方法

【坑】JDK21虛擬線程不支持run方法 run // do nothing java.lang.VirtualThread Overridepublic void start() {start(ThreadContainers.root());}Overridepublic void run() {// do nothing}

vue的模板編譯

Vue如何進行模板編譯 Vue 模板編譯是 Vue.js 在運行時將模板字符串轉換為渲染函數的過程。Vue 模板編譯分為兩個主要步驟&#xff1a; 模板解析&#xff1a; Vue 編譯器將模板字符串解析成一個抽象語法樹&#xff08;AST&#xff0c;Abstract Syntax Tree&#xff09;。AST 是…

2023年,人工智能在醫療行業領域的應用場景

本期行業洞察將帶領大家了解人工智能在醫療行業領域的應用&#xff0c;主要了解在患者治療和運營中的應用、人工智能作為預防工具以及大型醫院目前如何使用人工智能。未來的智慧醫療時代已經悄然到來。 人工智能在患者治療和機構運營中的應用 人工智能有望徹底改變醫療護理的…

csapp archlab part 1

part A [rootedb3963640a6 misc]#./yas sum.ys [rootedb3963640a6 misc]# ./yis sum.yo./yas 和 ./yis 是匯編語言編譯器和模擬器的命令行工具。 ./yas 是一個匯編語言編譯器&#xff0c;它將匯編語言代碼轉換為可執行的二進制文件。./yas sum.ys 將sum.ys文件編譯成了sum.yo可…

Mysql 中如何導入數據?

文章目錄 前言使用 LOAD DATA 導入數據使用 mysqlimport 導入數據mysqlimport的常用選項介紹后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;Mysql &#x1f431;?&#x1f453;博主在前端領域還有很多知識和技術需要掌握&#xff0c;正…

計算機畢業設計項目選題推薦(免費領源碼)Java+ssm+MYSQL酒店大數據資源管理系統的設計與實現02029

摘要 信息化社會內需要與之針對性的信息獲取途徑&#xff0c;但是途徑的擴展基本上為人們所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人們經常能夠獲得不同類型信息&#xff0c;這也是技術最為難以攻克的課題。針對酒店大數據資源管理系統等問題&#xff0c;對…

發揮云計算潛力:Amazon Lightsail 與 Amazon EC2 的綜述

文章作者&#xff1a;Libai 歡迎來到云計算世界&#xff0c;這里有無數的機會和無限的應用程序增長。 在當今的數字時代&#xff0c;企業可能會發現管理基礎架構和擴展應用程序具有挑戰性。 傳統的本地解決方案需要大量的硬件、軟件和維護前期投資。 要滿足不斷增長的需求&…

3D Slicer使用與體繪制

3D Slicer默認不進行體繪制&#xff0c;右上角的三維重建窗口只顯示一個空的立方體框。要進行體繪制&#xff0c;先切換到體繪制設置窗口&#xff1a; 在體繪制設置窗口中&#xff0c;選擇進行體繪制的DICOM序列&#xff0c;然后將體繪制開關打開&#xff08;眼睛標志&#xff…

如何快速查找日志?

快速查找日志 在報障處理中&#xff0c;經常會有查日志的情況&#xff0c;快速查找日志&#xff0c;就能快速發現問題。 以下提供我常用的二種查找方式&#xff1a;關鍵詞查找和時間查找。 1.關鍵詞 cat <fileName> | grep 關鍵詞2.按時間順序切割日志文件 sed -n /2023…

Omniverse合成數據生成【城市交通場景】

智慧城市是城市生活的未來。 然而&#xff0c;它們可能給城市規劃者帶來各種挑戰&#xff0c;尤其是在交通領域。 為了取得成功&#xff0c;城市的各個方面—從環境和基礎設施到商業和教育—必須在功能上整合。 這可能很困難&#xff0c;因為單獨管理交通流量是一個復雜的問題…

程序員護城河:保障系統安全與網絡穩定的不可或缺力量

引言&#xff1a; 在當今數字化時代&#xff0c;計算機和互聯網的廣泛應用使得程序員的角色變得越來越重要。作為保障系統安全與網絡穩定的關鍵力量&#xff0c;程序員需要具備一系列的基本能力&#xff0c;同時還需掌握一些專業技術和策略&#xff0c;以確保系統運行的安全性…

Navicat 技術指引 | 適用于 GaussDB 的查詢編輯器

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

leecode | HTML 解析器

提供一串字符串&#xff0c;根據給定的規則&#xff0c;去解析該字符串&#xff0c;并返回結果 簡而言之&#xff0c;就是根據指定的格式&#xff0c;替換內容 HTML 里這些特殊字符和它們對應的字符實體包括&#xff1a; 雙引號&#xff1a;字符實體為 " &#xff0c;對應…

立言

根據我的理解&#xff0c;不了解佛法 和 了解佛法 得看 因緣。相比較了解佛法&#xff0c;理解佛法則顯得更難&#xff1b;相比較理解佛法&#xff0c;見解佛法則顯得更難&#xff1b;相比較見解佛法&#xff0c;證解佛法則顯得更難&#xff1b;相比較證解佛法&#xff0c;真正…

vue 文件md5

一、在項目根目錄下安裝 npm install --save js-md5 二、在vue文件中引入 import md5 from ‘js-md5’; 三、在vue文件中使用 md5(1); // d41d8cd98f00b204e9800998ecf84273// 加密中文 md5(中文);// 其他 md5([]);// Different output md5(1); // d41d8cd98f00b204e98009…

智能導視電子指路牌是什么?

SVIP-3800系列智能電子指路牌也稱智慧指路燈桿&#xff0c;智能指路牌&#xff0c;導航立柱&#xff0c;多功能指示牌&#xff0c;多功能路標&#xff0c;智能指路機器人&#xff0c;智能導視指路牌&#xff0c;問路導航機器人&#xff0c;智能路牌&#xff0c;叁仟智慧路牌、智…