組み込みシステム開発における C++ データ変換およびエンコードおよびデコード機能の実装スキル

WBOY
リリース: 2023-08-26 17:24:24
オリジナル
1188 人が閲覧しました

組み込みシステム開発における C++ データ変換およびエンコードおよびデコード機能の実装スキル

#C 組み込みシステム開発におけるデータ変換とエンコード・デコード機能実装スキル

組み込みシステム開発において、データ変換とエンコード・デコードは非常に重要な機能の一つです。データをある形式から別の形式に変換する場合でも、送信や保存のためにデータをエンコードおよびデコードする場合でも、それを実現するには効果的な技術とアルゴリズムが必要です。 C は、組み込みシステム開発で広く使用されているプログラミング言語として、データ変換、エンコードおよびデコード機能の実装をサポートする豊富なライブラリとツールを提供します。

以下では、C でデータ変換とエンコードとデコードを実装するための一般的な手法をいくつか紹介し、対応するコード例を添付します。

1. データ型の変換

組み込みシステム開発では、さまざまなデータ型を変換する必要があることがよくあります。たとえば、整数から文字列への変換、文字列から整数への変換、浮動小数点から整数への変換などです。 C は、これらの変換操作をサポートするライブラリを提供します。

    整数と文字列の変換
整数を文字列に変換するには、ostringstream クラスを使用できます。サンプル コードは次のとおりです。

#include <iostream>
#include <sstream>

int main() {
    int num = 123;
    std::ostringstream oss;
    oss << num;
    std::string str = oss.str();
    std::cout << "Integer to string: " << str << std::endl;
    
    return 0;
}
ログイン後にコピー

文字列を整数に変換するには、istringstream クラスを使用できます。以下はサンプル コードです。

#include <iostream>
#include <string>
#include <sstream>

int main() {
    std::string str = "123";
    std::istringstream iss(str);
    int num;
    iss >> num;
    std::cout << "String to integer: " << num << std::endl;

    return 0;
}
ログイン後にコピー

    浮動小数点数と整数の変換
浮動小数点数を整数に変換するには、型キャスト演算子を使用できます。サンプル コードは次のとおりです。

#include <iostream>

int main() {
    double num = 3.14;
    int integer = static_cast<int>(num);
    std::cout << "Double to integer: " << integer << std::endl;

    return 0;
}
ログイン後にコピー

整数を浮動小数点数に変換するには、型キャスト演算子を使用できます。以下はサンプルコードです:

#include <iostream>

int main() {
    int integer = 3;
    double num = static_cast<double>(integer);
    std::cout << "Integer to double: " << num << std::endl;

    return 0;
}
ログイン後にコピー

2. エンコードとデコード

組み込みシステムでは、送信および保存のためにデータをエンコードおよびデコードする必要があることがよくあります。たとえば、データの圧縮と解凍、データの暗号化と復号化などです。 C では、これらのエンコードおよびデコード操作をサポートするいくつかのライブラリが提供されています。

    データの圧縮と解凍
C では、zlib ライブラリを使用してデータの圧縮と解凍を実現できます。以下はサンプル コードです。

#include <iostream>
#include <string>
#include <cstring>
#include <zlib.h>

std::string compress(const std::string& str) {
    z_stream zs;
    memset(&zs, 0, sizeof(zs));
    
    if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) {
        return "";
    }
    
    zs.next_in = (Bytef*)(str.c_str());
    zs.avail_in = str.size() + 1;
    
    char outbuffer[32768];
    std::string outstring;
    
    do {
        zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
        zs.avail_out = sizeof(outbuffer);
        
        if (deflate(&zs, Z_FINISH) == Z_STREAM_ERROR) {
            deflateEnd(&zs);
            return "";
        }
        
        outstring.append(outbuffer, sizeof(outbuffer) - zs.avail_out);
        
    } while (zs.avail_out == 0);
    
    deflateEnd(&zs);
    
    return outstring;
}

std::string decompress(const std::string& str) {
    z_stream zs;
    memset(&zs, 0, sizeof(zs));
    
    if (inflateInit(&zs) != Z_OK) {
        return "";
    }
    
    zs.next_in = (Bytef*)(str.c_str());
    zs.avail_in = str.size();
    
    char outbuffer[32768];
    std::string outstring;
    
    do {
        zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
        zs.avail_out = sizeof(outbuffer);
        
        if (inflate(&zs, 0) == Z_STREAM_ERROR) {
            inflateEnd(&zs);
            return "";
        }
        
        outstring.append(outbuffer, sizeof(outbuffer) - zs.avail_out);
        
    } while (zs.avail_out == 0);
    
    inflateEnd(&zs);
    
    return outstring;
}

int main() {
    std::string str = "Hello, World!";
    
    // 压缩
    std::string compressed = compress(str);
    std::cout << "Compressed: " << compressed << std::endl;
    
    // 解压缩
    std::string decompressed = decompress(compressed);
    std::cout << "Decompressed: " << decompressed << std::endl;
    
    return 0;
}
ログイン後にコピー

    データの暗号化と復号化
C では、openssl ライブラリを使用してデータの暗号化と復号化を実装できます。以下にサンプル コードを示します。

#include <iostream>
#include <string>
#include <openssl/aes.h>
#include <openssl/rand.h>

std::string encrypt(const std::string& key, const std::string& plain) {
    std::string encrypted;
    AES_KEY aesKey;
    
    if (AES_set_encrypt_key(reinterpret_cast<const unsigned char*>(key.c_str()), 128, &aesKey) < 0) {
        return "";
    }
    
    int len = plain.length();
    
    if (len % 16 != 0) {
        len = (len / 16 + 1) * 16;
    }
    
    unsigned char outbuffer[1024];
    memset(outbuffer, 0, sizeof(outbuffer));
    AES_encrypt(reinterpret_cast<const unsigned char*>(plain.c_str()), outbuffer, &aesKey);
    
    encrypted.assign(reinterpret_cast<char*>(outbuffer), len);
    
    return encrypted;
}

std::string decrypt(const std::string& key, const std::string& encrypted) {
    std::string decrypted;
    AES_KEY aesKey;
    
    if (AES_set_decrypt_key(reinterpret_cast<const unsigned char*>(key.c_str()), 128, &aesKey) < 0) {
        return "";
    }
    
    unsigned char outbuffer[1024];
    memset(outbuffer, 0, sizeof(outbuffer));
    AES_decrypt(reinterpret_cast<const unsigned char*>(encrypted.c_str()), outbuffer, &aesKey);
    
    decrypted.assign(reinterpret_cast<char*>(outbuffer));
    
    return decrypted;
}

int main() {
    std::string key = "1234567890123456";
    std::string plain = "Hello, World!";
    
    // 加密
    std::string encrypted = encrypt(key, plain);
    std::cout << "Encrypted: " << encrypted << std::endl;
    
    // 解密
    std::string decrypted = decrypt(key, encrypted);
    std::cout << "Decrypted: " << decrypted << std::endl;
    
    return 0;
}
ログイン後にコピー

この記事では、組み込みシステム開発における C でのデータ変換とエンコードおよびデコードの一般的な手法をいくつか紹介し、関連するコード例を示します。組み込みシステム開発に携わる開発者の参考になれば幸いです。

以上が組み込みシステム開発における C++ データ変換およびエンコードおよびデコード機能の実装スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート