0

aa:bb:cc:dd:ee:ffに解析する必要のある文字配列(のようなイーサネットアドレス)がありunsigned char[6]ます。strtokを使用して文字の各ペアを取得しており、それらをunsigned charにキャストする必要がありますが、何も機能していません。

私が試しました(c長さ2のchar *であると仮定します):

unsigned char t = (unsigned char)c;  // gives "loses precision" error

unsigned char* t = (unsigned char*)c;
unsigned char t1 = t[0];                  // gives the wrong value

unsigned char t;
strcpy((char*)t, c);      // gives the wrong value
strncpy((char*)t, c, sizeof(char)*2) // gives the wrong value
4

2 に答える 2

0

入力文字列が最大 2 つの 16 進数を含む 16 進文字列であると仮定すると、変換を行うためにFF使用できます。std::stringstream

int n;

std::stringstream ss;
ss << std::hex << c;
ss >> n;

unsigned char x = (unsigned char)n;

c実際には よりも大きくないことを確認する必要がありますFF

編集: 上記のコードを変更して、値をint最初に読み取ってから にキャストしましたunsigned char。に直接読み取る場合char、変換なしで文字のみを読み取ります。

于 2012-04-21T18:00:37.037 に答える
0

コンパイラは、32/64 ビットのポインターを 8 ビットの数値にキャストしていると見なします。基本型をキャストしても、文字列の内容は解釈されません。

考えてみてください。あなたが具体的に何をしたいのか、どうやって知るのでしょうか? それが 16 進表記であることをどのように知るのでしょうか。

16 進値を含む文字列を数値に変換しようとしています。これは、基本型をキャストするだけでは実行できない変換です。提案については、この質問への回答をご覧ください。または、C++ を使用しているため、ストリームを使用できます。これは、少し優れていると思います。例:

#include <sstream>
#include <iostream>
#include "stdio.h"

int main(int argc, char* argv[])
{
    char *addr[] = { "aa", "bb", "cc", "dd", "ee", "ff" };
    unsigned char binaddr[6];
    for(size_t i = 0; i < 6; ++i)
    {
        size_t word_result;
        std::istringstream addr_stream(addr[i]);
        addr_stream >> std::hex >> word_result;
        binaddr[i] = word_result;
    }
    printf("%x:%x:%x:%x:%x:%x\n", binaddr[0], binaddr[1], binaddr[2], binaddr[3], binaddr[4], binaddr[5]);
    return 0;

}
于 2012-04-21T18:25:33.310 に答える