將結構體數據存儲到一段字符串string中

核心思想

  • 指定一段內存空間存儲結構體數據,然后使用一個指針強制類型轉化為結構體類型的,就可以使用這個指針操作結構體相關的成員函數和變量
  • 結構體內存只會為定義的變量進行分配內存空間,函數只進行調用,不占據空間

結構體

  void fill_md5(const std::string &md5_digest) {assert(md5_digest.length() == sizeof(md5));std::memcpy(md5, md5_digest.c_str(), sizeof(md5));}bool check_md5(const std::string &md5_digest) {assert(md5_digest.length() == sizeof(md5));return std::memcmp(md5, md5_digest.c_str(), sizeof(md5)) == 0;}void fill_current_version_info() {mgmt_max_key_storage_rsa = MGMT_MAX_KEY_STORAGE_RSA;mgmt_max_key_storage_ecc = MGMT_MAX_KEY_STORAGE_ECC;mgmt_max_key_storage_symmetric = MGMT_MAX_KEY_STORAGE_Symmetric;version = MGMT_BACKUP_VERSION;time = std::time(nullptr);}bool check_version_info() const {return mgmt_max_key_storage_rsa == MGMT_MAX_KEY_STORAGE_RSA &&mgmt_max_key_storage_ecc == MGMT_MAX_KEY_STORAGE_ECC &&mgmt_max_key_storage_symmetric == MGMT_MAX_KEY_STORAGE_Symmetric &&version == MGMT_BACKUP_VERSION;}
};

給結構體分配空間

  bool backup(const std::string &password,const std::string &backup_file) override {MGMT_TRY_BEGIN//調用KeyStorage的backup接口,得到原始備份文件的字節流auto backup_data = key_storage->backup();//計算md5std::string md5_data = common::get_md5_digest(backup_data);//在其尾部填充備份參數數據backup_data.resize(backup_data.length() + sizeof(util::BackupFileHeader));auto backup_params = reinterpret_cast<util::BackupFileHeader *>(&backup_data[backup_data.length() - sizeof(util::BackupFileHeader)]);backup_params->fill_md5(md5_data);backup_params->fill_current_version_info();//對處理后的數據進行加密,加密密鑰由入參指定,將備份文件寫入指定的文件夾util::aes_encrypt_to_file(backup_file, password, backup_data);MGMT_TRY_END}
  • 將結構體數據追加到先前的string類型的md5_string字符串的后面,需要指定一個指針找到結構體要存儲的位置
  • 具體是這一行的代碼?auto backup_params = reinterpret_cast<util::BackupFileHeader *>(&backup_data[backup_data.length() - sizeof(util::BackupFileHeader)]);

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

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

相關文章

Idea中搭建Resin運行環境(Mac)

一、背景 idea中搭建Resin運行環境&#xff0c;可以在idea中通過點擊Run按鈕直接調試應用。 二、Resin下載地址 下載地址&#xff1a;https://caucho.com/products/resin/download/gpl#download 我下載的是tar.gz的&#xff0c;通過tar -zxvf命令解壓到自己mac的任意目錄下…

Java牛客專項練習2020.12.10

TreeSet subset()方法: subset(from,true,to,true),返回從from元素到to元素的一個集合,true判斷是否包含邊境元素 Java與C Java與C都有三個特征: 封裝,繼承,多態 抽象類與接口 1.抽象類可以有構造方法,但不能new;接口沒有構造方法 2.抽象類中可以有普通成員變量int x等,接…

Idea中搭建Wildfly(JBoss)運行環境(Mac)

目錄一、簡介二、下載Wildfly&#xff08;JBoss&#xff09;三、配置Idea四、調試一、簡介 首先說一下在linux環境&#xff0c;只需要將war包上傳到 wildfly-8.2.0.Final/standalone/deployments 目錄&#xff0c;然后到 wildfly-8.2.0.Final/bin 目錄下 ./standalone.sh&…

啟動linux的rpc服務的命令

命令 sudo service rc-local status

java插入排序

插入排序 思路: 把集合分成有序表與無序表,最開始有序表只有一個元素,無序表有n-1個元素,排序過程中每次取出無序表的第一個元素,然后與有序表中的元素比較,插入到適當位置 小結: 1.一共要進行n-1次排序循環 排序過程 排序前--- [101, 34, 119, 1] 第1輪插入后--- [34, 101,…

一個簡單JavaAgent的實現

一、什么是javaagent javaagent是一個JVM“插件”&#xff0c;一種專門精心制作的.jar文件&#xff0c;它能夠利用JVM提供的Instrumentation API。 1.1、概要 Java Agent由三部分組成&#xff1a;代理類、代理類元信息和JVM加載.jar和代理的機制&#xff0c;整體內容如下圖所…

Openai的openai新版本調用方式

最近大家有沒有發現Openai的openai已經更新到1.6.1了,而且API的調用方式發生了巨大的變化,下面來看看openai新的調用方式吧。 歡迎關注公眾號 module ‘openai’ has no attribute ChatCompletion. 提示openai的版本過低。(pip install -U openai) 1. Chat API from openai…

計算機系統基礎 計算機系統的基本組成與基本功能

基礎知識點 1.1946年第一臺通用電子計算機ENIAC誕生 2.馮.諾依曼結構: 組成:輸入設備,輸出設備,存儲器,運算器,控制器 3.現代計算機結構模型: 組成 CPU中央處理器 PC程序計數器 IR指令寄存器 ALU算數邏輯部件 GPRs通用寄存器組 MAR存儲器地址寄存器 MDR存儲器數據寄存器 知…

Android UI卡頓監控

一、背景 應用的使用流暢度&#xff0c;是衡量用戶體驗的重要標準之一。Android 由于機型配置和系統的不同&#xff0c;項目復雜App場景豐富&#xff0c;代碼多人參與迭代歷史較久&#xff0c;代碼可能會存在很多UI線程耗時的操作&#xff0c;實際測試時候也會偶爾發現某些業務…

linux查看內核版本信息

使用命令 uname -acat /proc/version

C語言學習:snprintf()函數

函數原型&#xff1a; int snprintf(char* dest_str,size_t size,const char* format,...);函數功能&#xff1a; 先將可變參數 “...” 按照format的格式格式化為字符串&#xff0c;然后再將其拷貝至dest_str中。 頭文件&#xff1a; #include<stdio.h>注意事項&…

物理 質點運動學

常用公式 重點 1.求軌道方程:消去時間t 2.dr---->位置矢量大小的增量 3.求方向:tanax/y 4.求位置也就是求位移rxiyj即可 習題解析 1.求運動時一定要求出加速度,變速與勻速就是看a 2.求位移時必須看X0是不是為0,如果不為0,求位移與路程時都要減去x0 3. 記住等號兩邊統一…

使用CLion的時候,對于cmake的使用

問題概述 使用CLion的時候&#xff0c;一個大的項目會有一個總的CMakeLists.txt&#xff0c;這個是控制整個項目的編譯環境&#xff0c;但是針對測試的代碼會有自己的單獨的CMakeLists.txt&#xff0c;這個單獨的cmake文件是控制自己的程序所需要的環境即使是編譯單獨的測試程…

Android NDK之靜態/動態注冊Native方法

一、簡介 關于NDK有兩種方法注冊&#xff1a;靜態注冊和動態注冊。 靜態注冊&#xff1a; 就是直接在Java文件里寫個native方法 然后再c/c文件中實現這個方法就行了&#xff1b;動態注冊&#xff1a; 就是為了不要寫很長的方法名&#xff0c;用JNI_OnLoad方法實現預注冊&…

概率論 條件概率 全概率 貝葉斯公式

常用知識點 條件概率 1.P(B|A)1表示A發生的情況下B必然發生 A屬于B 2.可列可加性 P(BUC|A)P(B|A)P(C|A) 3.P(B|A)的樣本空間為A,A與B都發生了 大題解答思路 1.首先設取出一件商品為次品為事件A 2.寫B1:甲生產,B2:乙生產 PB1…PB2… P(A|B1)…P(A|B2)… 3.寫PAPB1*P(A|B1)……

使用命令行的方式,將ini配置文件中的配置信息傳遞給程序

ini配置文件 {"device_type": "fake","device_socket": "192.168.1.108:5000"} 使用rpc的方式 ./bin/hsm_device_apitest --gtest_filter"*aes_test" --device-type rpc --device-socket 192.168.1.108:5000 使用fake的方…

C語言學習:malloc()函數

函數聲明&#xff1a; void *malloc(size_t size)頭文件&#xff1a; #include <stdio.h>函數描述&#xff1a; 分配所需的內存空間&#xff0c;并返回一個指向它的指針。 參數&#xff1a; size – 內存塊的大小&#xff0c;以字節為單位。 返回值&#xff1a; 該…

java 希爾排序

希爾排序(更高效的插入排序) 減少最小數在最后一位的情況下要循環的次數 思路: 把數組按增量(n/2)分組,對每一組使用插入排序去排序交換位置,然后不停地增量/2,直到其為1時,結束 分組:如n/25 891723 8與3為一組 從不包含本身的數開始數兩種實現方法: 交換法(效率較低) 移動法…

使用gtest進行自己的單獨測試的代碼介紹

命令行 ./bin/hsm_device_apitest --gtest_filter"*aes_test" --device-type rpc --device-socket 192.168.1.108:5000 命令詳解 進入工程文件&#xff0c;mkdir build&#xff0c;cd build在build的文件夾下面執行cmake命令和make命令之后&#xff0c;會在build文…