2011-05-31 126 views

回答

2

如下您可轉換數據:

char* hexstr="aecf"; 
    int hexsize=strlen(hexstr); 
    unsigned char* myChar = new unsigned char[hexsize/2+1]; 
    myChar[hexsize/2]='\0' 
    for (int i=0,intj=0;i<hexsize;i+=2,j++) 
    { 
     int tmp; 
     sscanf(hexstr+i, "%2x",&tmp)); 
     myChar[j]=tmp; // warning, ignore it 
    } 

這是如果你不使用靜態字符串,否則使用其他的答案。

+0

'char * hexstr =「aecf」'在標準C++中已棄用。已經有大約15年了。而且爲什麼所有的C指針都亂碼呢? – 2011-05-31 09:25:50

+0

寫你自己的答案。如果你看到這個問題,返回tupe應該是unsigned char *。那麼使用指針有什麼困難? – Raiv 2011-05-31 09:33:17

+0

我有專業的責任去指出,當人們寫不準確的答案。 'char * hexstr =「aecf」'既棄用又危險。 – 2011-05-31 09:45:19

1
char myChar[] = { 0xAE, 0xCF }; 

有沒有神奇的,這將使字符串文本讀取二進制除非你自己解析它,有不過是給定的C的弱類型舊的方式排列的文字似乎總是有很多的工作的情況。

+1

C的「無類型自然」?咦? – 2011-05-31 09:11:07

+0

C有一個靜態的弱打字類型系統,這正是我所指的。與Haskell這樣的強類型語言相比,C讓你擺脫了許多險惡的東西。 – 2011-05-31 09:14:16

+0

@John:正確。它是一種靜態的弱類型語言。如何可以轉化爲「無類型」是......莫名其妙。 – 2011-05-31 09:17:29

2

你是從一個字符串開始,然後試圖將它轉換爲一個字節數組?如果是這樣,請複製字符串,每2個字符附加一個\ x。字符串litterals可以在其中包含\ x來表示一個十六進制字符,如 myStringLitterial =「\ xAE \ xCF」;

+0

但是你通過使用不同的輸入字符串來改變問題。 – 2011-05-31 09:14:04

+0

是的,的確如此,但我覺得這個問題更像是他試圖通過套接字發送數據(因此是無符號字符類型),他需要通過線路發送字節來匹配AE CF.只是一個想法。 – johnathon 2011-05-31 09:20:55

+0

'unsigned char'不僅僅用於套接字。但是,是的,我們需要知道他的更廣泛的目標,才能充分回答這個問題。 – 2011-05-31 09:25:31

0

C-ISH方式(使用std :: sprintf的):

#include <cstdio> 
/* ... */ 
const char *hexStr = "aecf"; 
unsigned char myChar[3]; 
std::sprintf (myChar, "%02x%02x", hexStr); 
+0

嗯,這是一個C++問題。 – 2011-05-31 09:26:35

+0

將''更改爲'',並且不要忘記'使用名稱空間std;'......這就是它。它不靈活嗎?是。它應該是?它取決於環境(固定長度記錄與十六進制數字的可變長度字符串)。無論如何,這只是一個例子。 – 2011-05-31 09:29:33

+1

如果您知道如何製作C++,請將它製作爲C++!否則,這不適合這個問題。 (並且,請不要'使用名字空間標準;'......呃) – 2011-05-31 09:30:11

0

假設hexStr具有偶數長度和myChar具有足夠 大小,將執行以下操作的代碼滿足目的 (雖然strtol是一個C函數)?

#include <string> 
#include <cstdlib> 

int main() { 
    std::string hexStr = "aecf"; 
    unsigned char myChar[2]; 

    for (unsigned i = 0; i < hexStr.size(); i += 2) 
    myChar[ i/2 ] = strtol(hexStr.substr(i, 2).c_str(), 0, 16); 
} 
0

我正在尋找同樣的事情,讀了很多,終於創造了這個功能

// in = "63 09 58 81" 
void hexatoascii(char *in, char* out, int len){ 
    char buf[5000]; 
    int i,j=0; 
    char * data[5000]; 
    printf("\n size %d", strlen(in)); 
    for (i = 0; i < strlen(in); i+=2) 
    { 
     data[j] = (char*)malloc(8); 
     if (in[i] == ' '){ 
      i++; 
     } 
     else if(in[i + 1] == ' '){ 
      i++; 
     } 
     printf("\n %c%c", in[i],in[i+1]); 
     sprintf(data[j], "%c%c", in[i], in[i+1]); 
     j++; 
    } 
    //printf("\n data %c", data); 
    for (i = 0; i < j-1; i++){ 
     int tmp; 
     printf("\n data %s", data[i]); 
     sscanf(data[i], "%2x", &tmp); 
     out[i] = tmp; 
    } 
    //printf("\n ascii value of hexa %s", out); 
} 
0

我回答在重複一樣的...但可能有人會在這裏找到它有用,C++ ish

#include <iostream> 
#include <sstream> 


int main() { 
    std::string myStr = "1122AA010A"; 

    std::stringstream ss; 
    int n; 
    for(int i = 0; i<myStr.length();) { 
     std::istringstream(myStr.substr(i,2))>>std::hex>>n; 
     ss<<(char)n; 
     i += 2; 
     } 

    std::string result = ss.str(); 
    //could also use ss.str().c_str() to get the c-ish result 

    std::cout<<"\n"<<result<<"\n"; 
    return 0; 
    }