使用C++檔案流庫fstream,讀寫操作十六進位制文字檔案
最近為智慧移動小車編寫上位機軟體的過程中,遇到了檔案讀寫處理的任務,檔案是一般的文字檔案.txt格式的,其內容由十六進位制資料組成。檔案內資料的格式如下:
FF FD 03 FD 77 FE 77 1C 27
FF FD 01 FE 00 FE 00 1E 28
FF FE 00 FE B4 FE B4 21 28
...
每一幀資料由9個十六進位制資料組成,用於標識智慧車執行過程的相對於參考軌跡的姿態偏差,以及執行過程的線速度與角速度值。
data[0]: 幀頭,由FF標識(實際操作過程資料幀頭並未使用到);
data[1],data[2]: 第一個有效資料,位置偏差aglErr,data[1]標識aglErr
data[7]: 第四個有效資料,表示智慧車實時線速度lineVct,顯然為正值;
data[8]: 第五個有效資料,表示智慧車實時角速度aglVct,顯然也為正值;
首先,需要把文字檔案中的資料讀出來並儲存在記憶體中,我使用的資料型別是vector<stirng>,程式碼如下:
void readFileToRawDatas(const char *p, std::vector<std::string> &m_rawDatas) { std::ifstream dataFile(p); if (dataFile) { std::string str; while (dataFile >> str) m_rawDatas.push_back(str); } else { qDebug() << "Open file failed!"; } }
其中,readFileToRawDatas函式接受兩個引數,第一個引數是要讀取檔案的路徑,第二個引數是資料儲存的目的位置
然後,將字串型別的十六進位制資料轉換為int型資料,可以由以下兩個函式來實現:
int hexCharToNum(const char c); 將單個字元('A'('a')-'F'('f'))轉換為對應的0-15範圍內的數字
int hexCharToNum(const char c)
{
int temp;
switch (c)
{
case '0':
temp = 0;
break;
case '1':
temp = 1;
break;
case '2':
temp = 2;
break;
case '3':
temp = 3;
break;
case '4':
temp = 4;
break;
case '5':
temp = 5;
break;
case '6':
temp = 6;
break;
case '7':
temp = 7;
break;
case '8':
temp = 8;
break;
case '9':
temp = 9;
break;
case 'A':
case 'a':
temp = 10;
break;
case 'B':
case 'b':
temp = 11;
break;
case 'C':
case 'c':
temp = 12;
break;
case 'D':
case 'd':
temp = 13;
break;
case 'E':
case 'e':
temp = 14;
break;
case 'F':
case 'f':
temp = 15;
break;
default:
break;
}
return temp;
}
int hexStrToInt(const string &str); 將兩個字元組成的十六進位制字串轉換為對應的int型資料
int hexStrToInt(const string &str)
{
int highBit = 0;
char lowBit = 0;
highBit = hexCharToNum(str[0]);
lowBit = hexCharToNum(str[1]);
return lowBit + 16 * highBit;
}
最後,實現資料的分類儲存
void dataAssort(const std::vector<std::string> &strVec)
{
int temp = 0;
for (auto iter = strVec.cbegin(); iter != strVec.cend(); iter += DATA_FRAME_BYTE)
{
//設定aglErrDatas
if ("FE" == *(iter + 1))
{
temp = hexStrToInt(*(iter + 2));
m_aglErrDatas.push_back(temp);
}
else
{
temp = -1 * hexStrToInt(*(iter + 2));
m_aglErrDatas.push_back(temp);
}
//設定xErrDatas
if ("FE" == *(iter + 3))
{
temp = hexStrToInt(*(iter + 4));
m_xErrDatas.push_back(temp);
}
else
{
temp = -1 * hexStrToInt(*(iter + 4));
m_xErrDatas.push_back(temp);
}
//設定yErrDatas
if ("FE" == *(iter + 5))
{
temp = hexStrToInt(*(iter + 6));
m_yErrDatas.push_back(temp);
}
else
{
temp = -1 * hexStrToInt(*(iter + 6));
m_yErrDatas.push_back(temp);
}
//設定lineVecDatas
temp = hexStrToInt(*(iter + 7));
m_lineVecDatas.push_back(temp);
//設定aglVecDatas
temp = hexStrToInt(*(iter + 8));
m_aglVecDatas.push_back(temp);
}
}
其中,DATA_FRAME_BYTE表示一幀資料的位元組數,即數字9
m_aglErrDatas~m_aglVecDatas是已經定義過的vector<int>物件,即上文我們所說的5個有效資料
最後,放一張離線環境下,通過讀取儲存在文字檔案中原始資料所繪製的智慧車位姿以及速度值的波形圖,如下:
相關推薦
使用C++檔案流庫fstream,讀寫操作十六進位制文字檔案
最近為智慧移動小車編寫上位機軟體的過程中,遇到了檔案讀寫處理的任務,檔案是一般的文字檔案.txt格式的,其內容由十六進位制資料組成。檔案內資料的格式如下: FF FD 03 FD 77 FE 77 1C 27 FF FD 01 FE 00 FE 00 1E 28 FF FE
編寫一個函式實現數制轉換。在主函式中輸人一個十進位制數,輸出相應的十六進位制數。要求用陣列實現
void decto16 (int a, char c[]) { // a為要轉換的十進位制數 將結果存放在陣列c中 ,以陣列形式輸出 int y; int k = 0; do { y = a % 16; a = a / 16; for (int i = 0
ASCII碼值轉化十六進位制,十進位制數;十六進位制字元值轉十進位制,ASCII碼值
用字元表示的十六進位制值轉化為十進位制,ASCII碼: bool ok; QStringList list; //初始化list的內容為:list = ("30", "31", "32", "33"
C int和BYTE互轉、字串轉十六進位制位元組陣列
//int 轉 4位元組 BYTE[], void intToByte(int i,BYTE abyte[]) { abyte[3] = (byte)(0xff & i); abyte[2] = (byte)((0xff00 & i) >>
呼叫webservice介面,報錯:(十六進位制值0x01)是無效的字元
--- ### #事故現場 呼叫webservice介面,報錯:(十六進位制值0x01)是無效的字元。 如圖: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020061319305357.png?x-oss-process=image/watermark,type_Zm
C++入門篇——輸入一個整數並將這個整數分別以八進位制,十進位制,十六進位制輸出;同時輸入一個布林值並且以布林值的方式打印出來
C++入門篇 輸入一個整數並將這個整數分別以 八進位制,十進位制,十六進位制輸出; 同時輸入一個布林值並且以 布林值的方式打印出來 注意:執行的時候需要按 ctrl鍵+F5 如果想只按F5就執行,在return 0;前面加一段程式碼: system("pause"); 同時需要
工作記錄:處理閃燈資料檔案,需要將10進位制轉為3位十六進位制
Vixen生成的.csv檔案,需要把裡面的資料轉為3位的16進位制。自己寫了一個程式來處理,在此記錄一下。 平臺:Qt Creator /*********************** * Name : main.cpp * Author : Lon * Date
BASIC-12 基礎練習 十六進位制轉八進位制 (c++)兩種解法,轉換2進位制或10進位制。
基礎練習 十六進位制轉八進位制 時間限制:1.0s 記憶體限制:512.0MB 錦囊1 使用二進位制。 錦囊2 先把十六進位制轉成二進位制,每位十六進位制正好
C語言,進位制轉換之十六進位制轉二進位制,完整程式碼
#include "iostream" using namespace std; #define MAX 50 int main()//十六轉二 { int elem2[MAX]; char elem16[MAX]; cout <
C語言實現位元組流與十六進位制字串的相互轉換
//位元組流轉換為十六進位制字串void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen){ short i; unsigned char highByte, lowByte; for (i = 0; i
C++ printf列印二進位制,三進位制,八進位制,十六進位制等(利用itoa)
printf是格式化輸出函式,它可以直接列印十進位制,八進位制,十六進位制,輸出控制符分別為%d, %o, %x, 但是它不存在二進位制,如果輸出二進位制可以呼叫stdlib.h裡面的itoa函式。
c++ 十六進位制,八進位制,十進位制 的 輸入
在預設的情況下,系統約定輸入的整型數是十進位制資料。當要求按八進位制或十六進位制輸入資料時,在cin中必須指明相應的資料型別:hex為十六進位制;oct為八進位制;dec為十進位制。 int i,j
C語言,進位制轉換之二進位制轉十六進位制,完整程式碼
#include "iostream" using namespace std; #define MAX 50 int _2to16()//二轉十六 { cout << "請輸入二進
arduino通過讀寫十六進位制資料串與超聲雷達通訊
用的下面這款的雷達,裝在小車上,前、左、右各一個,arduino NANO(或UNO)開發板一塊,為了除錯方便,用的軟串列埠。 先用店家提供的軟體(如下圖)一個一個連線並寫引數,我這裡設了1、2、3三個站,都設成了角度等級level-1(不知有何用)和9600波特率,廠家提醒觸發週期最好在
c++ 十六進位制字串存入檔案例項
c++ 十六進位制字串存入檔案: 方法一: void writeToFile() { const char* str = "000000DD000000E00000015C000000E2"; FILE* file = fopen("test.txt", "wb"); as
C++ 讀取PE檔案並十六進位制列印輸出
分析PE結構的時候,想自己把裡邊的結構理解後列印LoadPE分析的東西,在此先把讀取PE 結構的C++程式碼貼出來: #include <iostream> #include <iomanip> #include <windows.h>
[計算機程式設計C++] 輸入整數顯示十六進位制和八進位制
12 輸入整數顯示十六進位制和八進位制(10分) 題目內容: 編寫程式,輸入整數,顯示其十進位制、十六進位制和八進位制形式。如輸入31,輸出: -31 -1f -37 輸入:一個整數,注意,可能是負數。 輸出:三個數,十進位制、十六進位制和八進位制,用空格隔開。 提示
二進位制,十進位制,十六進位制互相轉化
二進位制轉化為十進位制:(1)從右向左數,確定所數的數字是第幾位(編號為n),轉化為十進位制的時候,用這個數乘以2的n-1次方,以此類推,將各個位上的數所得的式子相加即可,便得到了十進位制數。 特殊情況,如:二進位制數100,1000,10000,
Python程式設計:二進位制,八進位制,十六進位制與十進位制之間的轉換
進位制轉換的函式 bin() 10進位制轉2進位制 oct() 10進位制轉8進位制 hex()10進位制轉16進位制 int() *進位制轉10進位制 各進位制之間轉換 ↓ 2進位制 8進位制
Font Awesome向量版,十六進位制版,WPF字型使用
我之前在部落格中介紹過幾個向量相簿網站,在WPF程式中,一般接觸到的向量圖示資源有XAML、SVG、字型這三種格式。XAML是標準格式就不說了,SVG並不是直接支援的,不過微軟提供了Expression Design可以非常方便我們將其轉換為XAML格式的資源。而對於字型,雖然WPF是直接支援的,但由於字型圖