1. 程式人生 > >使用C++檔案流庫fstream,讀寫操作十六進位制文字檔案

使用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]: 第一個有效資料,位置偏差aglErrdata[1]標識aglErr

的符號,data[2]表示aglErr的數值;data[3],data[4]: 第二個有效資料,位置偏差xErrdata[3]標識xErr的符號,data[4]表示xErr的數值;data[5],data[6]: 第三個有效資料,航向角偏差yErrdata[5]標識yErr的符號,data[6]表示yErr的數值;

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個有效資料

最後,放一張離線環境下,通過讀取儲存在文字檔案中原始資料所繪製的智慧車位姿以及速度值的波形圖,如下:

            

其中,介面是用基於Qt框架所搭建,座標系圖形庫採用qcustomplot

相關推薦

使用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是直接支援的,但由於字型圖