線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1717
推到 Plurk!
推到 Facebook!

如何 convert 'unsigned char *' to HexString

答題得分者是:aftcast
yc601065
一般會員


發表:3
回覆:5
積分:1
註冊:2009-12-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-03-24 01:43:04 IP:124.8.xxx.xxx 訂閱

請問在C Builder裡如何 convert 'unsigned char *' to Hexstring(像255-->FF)

並使其可以顯示在Memo上.

不知可否給我個範例
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-03-24 03:46:53 IP:220.135.xxx.xxx 訂閱

[code cpp]
AnsiString as;
const int buf_len = 7; //假如長度是7
unsigned char buf[buf_len] ={'A','B','C','D','E','F','G'};
char *text = new char[buf_len*2 1];
memset(text,0,buf_len*2 1);
try
{
BinToHex(buf,text,buf_len); //這裡是重點
as = text;
this->_mmo1->Lines->Add(as);
}
__finally
{
delete [] text;
}

[/code]

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
yc601065
一般會員


發表:3
回覆:5
積分:1
註冊:2009-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-03-24 10:52:21 IP:220.130.xxx.xxx 訂閱
感謝aftcast回答
可以在請問一下如我今天宣告一指標 Type為Byte如下,也可以用此方式轉換輸出至Memo顯示嗎?
Byte *ptr;
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-03-24 13:23:41 IP:210.64.xxx.xxx 訂閱
unsigned char buf[buf_len] 與 Byte *ptr 是等價的,總之是可以"一樣的"

但轉換前你總要知道 ptr 指向多少個byte吧? 那就相當於我上面寫的buf_len。我是為了例子好寫,才定unsigned char buf[buf_len] 。

你試一下就知道了啊。若不行,你把你試我上面的例子貼出來看看。

===================引 用 yc601065 文 章===================
感謝aftcast回答
可以在請問一下如我今天宣告一指標 Type為Byte如下,也可以用此方式轉換輸出至Memo顯示嗎?
Byte *ptr;
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
yc601065
一般會員


發表:3
回覆:5
積分:1
註冊:2009-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-03-24 21:57:13 IP:220.130.xxx.xxx 訂閱

[code cpp]
{
int buf[] ={255,10,03,20,30,65,0};
Byte *ptr;
ptr=(unsigned char*)buf;
const int buf_len=sizeof(ptr);
char *text = new char[buf_len*2 1];
memset(text,0,buf_len*2 1);
try
{
BinToHex(ptr,text,buf_len); //這裡是重點
ptr = text;
this->_mmo1->Lines->Add(text);
}
__finally
{
delete [] text;
}
}
[/code]


顯示結果:FF000000
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-03-25 09:30:13 IP:210.64.xxx.xxx 訂閱

[code cpp]
BYTE buf[] ={255,10,03,20,30,65,0}; //一定要是BYTE (unsigned char) 或是 char,因為才會只占一個位元組的大小,如果是int就是4個bytes的大小
//Byte *ptr;
//ptr=(unsigned char*)buf; // 指標取大小,永遠都是4個bytes,觀念問題!
const int buf_len= sizeof(buf)/sizeof(BYTE); // 關於取陣列的大小,就像是這樣的寫法
char *text = new char[buf_len*2 1];
memset(text,0,buf_len*2 1);
try
{
BinToHex(buf,text,buf_len); //這裡是重點
this->_mmo1->Lines->Add(text);
}
__finally
{
delete [] text;
}

[/code]


我想你的c 的基本功力還不夠,要再加強一些。不然這問題沒完沒了…
你原來的錯是因為
1/ 你宣告的是int的陣列,即使你的值是255,你知道嗎? 在記憶體裡長的是4個bytes的排列,即 FF 00 00 00
2/ 你以為強轉指標可以將原來的int的記憶體內容變成一個byte嗎? 不會! 它還是 FF 00 00 00
3/ 你以為要找出指標所指的內容長度只要sizeof就可以,錯了! 這樣做的結果永遠都是4,因為指標就是記憶體位址,而在32位元的系統下,它就是4個bytes
4/ 所以,結果就是你錯誤的取得 4 的長度來找一個 錯誤的int 的 FF 00 00 00

或許你對第四點還是有會"霧殺殺",但真的沒辮法了,你要先增加內力,否則無法再進階。


請結案吧! 謝謝!

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2017-12-12 12:32:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!