2016-12-09 21 views
0

変数x、x-(0 ... F)を持つ16進ASCII形式[3x3x3x3x]の文字列があります。たとえば、私は文字列から新しい文字列に特定の16進値を抽出する

データ

inData = 0x30303f3f

で取得し、それを変換することができます。

outData = 0x00ff

または

inData = 0x3f3f3f3f

outData = 0xffff

ここでビット操作を行う最善の方法は、本当に私は "3s"をスキップしたいのですか?

// receive answer from device 
if (ReceiveMsg(FLog, TLog::INFO, FSerial, &ReceiveStr)) 
{ 
    int side; 
    char inData[4]; 
    char serial[6]; 
    char status; 

    if (sscanf(ReceiveStr.GetData(), "\x2%6s\x84%1d%4c%c", &serial, &side, &inData, &status) == 4) { 

     *Status = status & 0x0f; 

     // decode hex ASCII 
     int time = 0; 
     int j = 0; 
     for (int i = 3; i >= 0; i--) { 
      time = time + ((inData[i] & 0x0f) *(pow(16, j))); 
      j++; 
     } 
     *Timer = time; 
     result = true; 
    } 
} 
  • inDataの大きさ[4] = 0x30を、0x30を、0x3fを、0x3fを
  • 時間何のためにループを行うにはどのような方法がある場合= 255(出力)私は疑問に思う

ビットシフトなどと同じように速くなりますか?

+0

あなたが試したことを示してください。 –

+1

出力はまだ文字列か、それとも解析しますか?そして、 '_pext_u32'や' _mm_shuffle_epi8'のようなものを許可しますか? – harold

+0

それは意味をなさない。 '0x30303f3f'は' 0x00ff'ではなく、 '0x3f3f3f3f'は' 0xffff'ではありません –

答えて

0
char inData[] = "0x30303f3f"; 
char outData[7] = "0x"; 
outData[2] = inData[3]; 
outData[3] = inData[5]; 
outData[4] = inData[7]; 
outData[5] = inData[9]; 
0
final_result=source<<4 & 0xf0000000+source<<8 & 0x0f000000+source<<12 & 0x00f00000+source<<16 & 0x000f0000 ; 
final_result>>=16; 
0

あなたは、例えば、バイナリファイルからのデータ、またはメモリ内のデータのために、バイナリデータを参照しています。このデータは、16進形式の文字列として表すことができます

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    unsigned char data[] = { 0x30, 0x30, 0x3F, 0x3F }; 
    int data_size = sizeof(data)/sizeof(data[0]); 

    char *str = malloc(data_size * 2 + 1); 
    int i; 
    for(i = 0; i < data_size; i++) 
     sprintf(&str[i * 2], "%02X", data[i]); 
    str[i * 2] = 0; 
    printf("%s\n", str); 
    return 0; 
} 

結果は"30303F3F"

であるか、データを文字列に格納することができますが、それは非常に一般的ではありません。

int main() 
{ 
    const char *data = ""; 
    int data_size = strlen(data); 

    char *str = malloc(data_size * 2 + 1); 
    int i; 
    for(i = 0; i < data_size; i++) 
     sprintf(&str[i * 2], "%02X", data[i]); 
    str[i * 2] = 0; 
    printf("%s\n", str); 

    return 0; 
} 

結果:"30313233343536373839"

0は、これらすべての3年代はどこから来たのです値0x30あり、かつ10x31であるなどの文字であること。

関連する問題