假設我的十六進制字符串。 hexStr = "aecf"
如何將十六進制字符串分配給char []變量?
如何分配十六進制字符串值到unsigned char myChar[]
如下。謝謝。
myChar[0] = 0xae;
myChar[1] = 0xcf;
假設我的十六進制字符串。 hexStr = "aecf"
如何將十六進制字符串分配給char []變量?
如何分配十六進制字符串值到unsigned char myChar[]
如下。謝謝。
myChar[0] = 0xae;
myChar[1] = 0xcf;
如下您可轉換數據:
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
}
這是如果你不使用靜態字符串,否則使用其他的答案。
'char * hexstr =「aecf」'在標準C++中已棄用。已經有大約15年了。而且爲什麼所有的C指針都亂碼呢? – 2011-05-31 09:25:50
寫你自己的答案。如果你看到這個問題,返回tupe應該是unsigned char *。那麼使用指針有什麼困難? – Raiv 2011-05-31 09:33:17
我有專業的責任去指出,當人們寫不準確的答案。 'char * hexstr =「aecf」'既棄用又危險。 – 2011-05-31 09:45:19
char myChar[] = { 0xAE, 0xCF };
有沒有神奇的,這將使字符串文本讀取二進制除非你自己解析它,有不過是給定的C的弱類型舊的方式排列的文字似乎總是有很多的工作的情況。
C的「無類型自然」?咦? – 2011-05-31 09:11:07
C有一個靜態的弱打字類型系統,這正是我所指的。與Haskell這樣的強類型語言相比,C讓你擺脫了許多險惡的東西。 – 2011-05-31 09:14:16
@John:正確。它是一種靜態的弱類型語言。如何可以轉化爲「無類型」是......莫名其妙。 – 2011-05-31 09:17:29
你是從一個字符串開始,然後試圖將它轉換爲一個字節數組?如果是這樣,請複製字符串,每2個字符附加一個\ x。字符串litterals可以在其中包含\ x來表示一個十六進制字符,如 myStringLitterial =「\ xAE \ xCF」;
但是你通過使用不同的輸入字符串來改變問題。 – 2011-05-31 09:14:04
是的,的確如此,但我覺得這個問題更像是他試圖通過套接字發送數據(因此是無符號字符類型),他需要通過線路發送字節來匹配AE CF.只是一個想法。 – johnathon 2011-05-31 09:20:55
'unsigned char'不僅僅用於套接字。但是,是的,我們需要知道他的更廣泛的目標,才能充分回答這個問題。 – 2011-05-31 09:25:31
C-ISH方式(使用std :: sprintf的):
#include <cstdio>
/* ... */
const char *hexStr = "aecf";
unsigned char myChar[3];
std::sprintf (myChar, "%02x%02x", hexStr);
嗯,這是一個C++問題。 – 2011-05-31 09:26:35
將'
如果您知道如何製作C++,請將它製作爲C++!否則,這不適合這個問題。 (並且,請不要'使用名字空間標準;'......呃) – 2011-05-31 09:30:11
假設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);
}
我正在尋找同樣的事情,讀了很多,終於創造了這個功能
// 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);
}
我回答在重複一樣的...但可能有人會在這裏找到它有用,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;
}
陳述你的更廣泛的目標。 – 2011-05-31 09:07:07