1

固定長の unsigned char 配列を取り、フォーマットされた char * として返すヘルパー関数があります。しかし、私はいくつかの問題を抱えています。

私は試した

char* byteArrayToString(unsigned char byte[6]) {
    char t[18] = {""};
    char* str = t;
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

char* byteArrayToString(unsigned char byte[6]) {
    std::string t = "";
    char* str = t;
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

char* byteArrayToString(unsigned char byte[6]) {
    char* str = new char();
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

2 番目のものは、その文字列の値が変更されるといういくつかの副作用をもたらします。最初のものはジャンク値と最後のセグメント障害を私に与えることになります(しかし、私はその理由を理解できません).

4

2 に答える 2

3

適切な方法は、次のように返すstd::stringことです。

#include <sstream>   //for std::ostringstream
#include <string>    //for std::string
#include <iomanip>   //for std::setw, std::setfill

std::string byteArrayToString(unsigned char byte[6]) 
{
    std::ostringstream ss;
    for(size_t i = 0 ; i < 5 ; ++i)
         ss << "0X" << std::hex << std::setw(2) << std::setfill('0') << (int) byte[i] << ":";
    ss << "0X" << std::hex << std::setw(2) << std::setfill('0') << (int) byte[5];
    return ss.str();
}

オンラインデモ

コールサイトでは、次のように取得できますconst char*

std::string s = byteArrayToString(bytes);
const char *str = s.c_str();
于 2012-04-22T01:37:14.110 に答える
3

あなたの最初のものの問題は印刷ではなく、返品にあります。再利用された配列へのポインターを返しています (自動変数であるため、関数が戻るとその有効期間は終了します)。

代わりに試してください:

string byteArrayToString(const unsigned char* const byte)
{
    char t[18] = {""};
    sprintf(t, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return t;
}
于 2012-04-22T01:57:06.190 に答える