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

請問關於HEX轉成文字字串

答題得分者是:boss.tw
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-01 14:29:06 IP:59.105.xxx.xxx 訂閱
請問我現在有一個確定是文字的記憶體值
用ReadProcessMemory讀出來的
但是我要將他轉成中文或是英文的字串
也就是像市面上那些16進位編輯器
的轉換
我找了很多文章但是都是字串轉HEX
請問有人知道該怎麼轉換嗎?
mis881085
一般會員


發表:2
回覆:7
積分:6
註冊:2005-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-02 02:06:42 IP:220.136.xxx.xxx 訂閱
sprintf(strbuf,"0x%x",value);
因該就可以搞定囉
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-02 02:18:25 IP:59.105.xxx.xxx 訂閱

===================引 用 mis881085 文 章===================
sprintf(strbuf,"0x%x",value);
因該就可以搞定囉

抱歉
我不太懂你說的方法
sprintf不是用來印在非視窗介面的模式嗎?
在BCB中怎麼使用?
我在BCB裡面用sprintf的時候會出現
尚未定義此function
如果可以
能再說清楚一點嗎?
謝謝
mis881085
一般會員


發表:2
回覆:7
積分:6
註冊:2005-04-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-02 03:04:22 IP:220.136.xxx.xxx 訂閱
sprintf是用來印在字串陣列裡面唷!!這個還蠻好用的
以下範例 cHex的值為"0xFF"也就是你要的16進制轉成字串的結果
踹踹看吧~
example...

#include //don't forget it...!
.....
.....
int iHex = 0xFF;
char *cHex;
cHex= new char[10];
sprintf(cHex,"0x%x",iHex);
ShowMessage(&cHex[0]);
delete [ ] cHex;

....
編輯記錄
mis881085 重新編輯於 2009-01-02 03:07:31, 註解 無‧
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-02 14:23:08 IP:59.105.xxx.xxx 訂閱

===================引 用 mis881085 文 章===================
sprintf是用來印在字串陣列裡面唷!!這個還蠻好用的
以下範例 cHex的值為"0xFF"也就是你要的16進制轉成字串的結果
踹踹看吧~
example...

#include //don't forget it...!
.....
.....
int iHex = 0xFF;
char *cHex;
cHex= new char[10];
sprintf(cHex,"0x%x",iHex);
ShowMessage(&cHex[0]);
delete [ ] cHex;

....


抱歉!!
我試了一下但是
這個不是我要的
可能是我沒有的很清楚
我想要的是可以將hex值直接轉換成中文字
或是英文
例如:"測試"就是"0xB4FAB8D5"
不過還是非常謝謝你的幫忙
mis881085
一般會員


發表:2
回覆:7
積分:6
註冊:2005-04-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-02 14:40:35 IP:220.136.xxx.xxx 訂閱

===================引 用 回憶樂章 文 章===================

===================引 用 mis881085 文 章===================
sprintf是用來印在字串陣列裡面唷!!這個還蠻好用的
以下範例 cHex的值為"0xFF"也就是你要的16進制轉成字串的結果
踹踹看吧~
example...

#include //don't forget it...!
.....
.....
int iHex = 0xFF;
char *cHex;
cHex= new char[10];
sprintf(cHex,"0x%x",iHex);
ShowMessage(&cHex[0]);
delete [ ] cHex;

....


抱歉!!
我試了一下但是
這個不是我要的
可能是我沒有的很清楚
我想要的是可以將hex值直接轉換成中文字
或是英文
例如:"測試"就是"0xB4FAB8D5"
不過還是非常謝謝你的幫忙
===============================
如果先強迫轉型成為int 在轉成文字呢??
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-02 15:18:31 IP:203.67.xxx.xxx 訂閱

===================引 用 mis881085 文 章===================

===================引 用 回憶樂章 文 章===================

===================引 用 mis881085 文 章===================
如果先強迫轉型成為int 在轉成文字呢??

還是不行耶
會出現記憶體錯誤= ="'
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-01-02 23:27:58 IP:122.116.xxx.xxx 訂閱
要不要 po 出 source code 大家才好幫你
你讀出的 buffer 應該是 pvoid
其實 hex 的值就是 每個字串的值,不需要轉換
只需轉型就可以,但讀出的 buffer 最後需要有結束字元,才不會後面接個不是字串的亂碼

[code cpp]

PVOID test = "測試";
printf("%s\n", (char *)test);

[/code]
編輯記錄
boss.tw 重新編輯於 2009-01-02 23:46:06, 註解 無‧
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-01-03 00:53:41 IP:203.67.xxx.xxx 訂閱

===================引 用 boss.tw 文 章===================
要不要 po 出 source code 大家才好幫你
你讀出的 buffer 應該是 pvoid
其實 hex 的值就是 每個字串的值,不需要轉換
只需轉型就可以,但讀出的 buffer 最後需要有結束字元,才不會後面接個不是字串的亂碼

[code cpp]

PVOID test = "測試";
printf("%s\n", (char *)test);

[/code]


我用下面的程式碼取得程式執行後記憶體中的東西
程式碼大概如下
[code cpp]
DWORD name;
Form1->Handle1=FindWindow(0,"1");
if(Form1->Handle1!=NULL)
{
GetWindowThreadProcessId(Form1->Handle1,&Form1->ProcID);
Form1->c=OpenProcess(PROCESS_ALL_ACCESS,false,Form1->ProcID);
}

ReadProcessMemory(c,(void *)0X0068B614,&name,8,0);
[/code]
但是我從name中取得的數值就類似這樣 "0000B4FA"
但是我想要把他轉換成中文 "測"
不知道怎樣有沒有清楚一點?
編輯記錄
回憶樂章 重新編輯於 2009-01-03 00:54:24, 註解 無‧
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-01-06 13:21:06 IP:60.250.xxx.xxx 訂閱

[code cpp]
String S;
char *Mychar = "測試";
ShowMessage(S.sprintf("Mychar = %s", Mychar) );
short Mychar1 = 0x00B4FA;
short Mychar2 = 0x00B8D5;
char Mychar3[512] ={0};
Mychar3[1] = Mychar1 &0xFF;
Mychar3[0] = Mychar1 >>8;
ShowMessage(S.sprintf("Mychar3 = %s", Mychar3 ) );

[/code]
編輯記錄
boss.tw 重新編輯於 2009-01-06 13:22:13, 註解 無‧
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-01-06 22:14:55 IP:59.105.xxx.xxx 訂閱

===================引 用 boss.tw 文 章===================

[code cpp]
String S;
char *Mychar = "測試";
.........

[/code]
抱歉
上面的程式碼我還是不太懂
因為那樣不是只能用自己設定的字嗎?
但是如果記憶體中讀出來的是 "測A試"的HEX
那要怎麼辦?
我用下面的寫法把他們全部合起來到一個String中
但是該怎麼血才能把真正的文字印出來?

[code cpp]
Byte name;
short Mychar=0x000000;
AnsiString addr;
char *word=new char;
for(int i=0;i<16;i )
{
ReadProcessMemory(c,Pointer(NAME_ADR i),&name,4,0);
if(name!=0x00)
{
addr =IntToHex(int(name),1);
}
}
ShowMessage(addr);
char *cHex=new char[10];
sprintf(cHex,"0x%s",addr);
ShowMessage(cHex)
[/code]
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-01-06 22:42:17 IP:118.169.xxx.xxx 訂閱
DWORD dwVal = 0xFAB4D5B8;
char *pV = (char*)(&dwVal);
ShowMessage(pV);
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-01-07 00:12:54 IP:122.116.xxx.xxx 訂閱
我沒用過 ReadProcessMemory
我看 help 說明第四個參數是指讀出的長度 DWORD nSize, // number of bytes to read
但是我看你的nSize =4 , name 是宣告 byte name; 看起來是有問題的
試試以下這段

[code cpp]
Byte name[4] ={0};
char cHex[512] ={0};
for(int i=0; i<16;i )
{
ReadProcessMemory(c,Pointer(NAME_ADR i),&name,4,0);
memcpy( &cHex[i*4], &name[i*4], 4 );
}
ShowMessage(cHex);
[/code]


以下是我測試的方法

[code cpp]
BYTE temp[4] ={0};
sprintf(temp, "測試看看有什麼問題A測試看看有什麼問題A測試看看有什麼問題A");

Byte name[4] ={0};
char cHex[512] ={0};
for(int i=0; i<16;i )
{
//ReadProcessMemory(c,Pointer(NAME_ADR i),&name,4,0);
memcpy( &cHex[i*4], &temp[i*4], 4 );
}
ShowMessage(cHex);
[/code]
編輯記錄
boss.tw 重新編輯於 2009-01-07 00:14:25, 註解 無‧
boss.tw 重新編輯於 2009-01-07 00:15:18, 註解 無‧
boss.tw 重新編輯於 2009-01-07 00:16:08, 註解 無‧
回憶樂章
一般會員


發表:3
回覆:8
積分:2
註冊:2006-10-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-01-07 00:22:34 IP:59.105.xxx.xxx 訂閱

===================引 用 boss.tw 文 章===================
我沒用過 ReadProcessMemory
我看 help 說明第四個參數是指讀出的長度 DWORD nSize, // number of bytes to read
但是我看你的nSize =4 , name 是宣告 byte name; 看起來是有問題的
試試以下這段

[code cpp]
Byte name[4] ={0};
char cHex[512] ={0};
for(int i=0; i<16;i )
{
ReadProcessMemory(c,Pointer(NAME_ADR i),&name,4,0);
memcpy( &cHex[i*4], &name[i*4], 4 );
}
ShowMessage(cHex);
[/code]


以下是我測試的方法

[code cpp]
BYTE temp[4] ={0};
sprintf(temp, "測試看看有什麼問題A測試看看有什麼問題A測試看看有什麼問題A");

Byte name[4] ={0};
char cHex[512] ={0};
for(int i=0; i<16;i )
{
//ReadProcessMemory(c,Pointer(NAME_ADR i),&name,4,0);
memcpy( &cHex[i*4], &temp[i*4], 4 );
}
ShowMessage(cHex);
[/code]

哇~~終於成功了
完全沒有想過可以用那個專研常用的memcpy
謝謝你拉
系統時間:2024-04-25 13:59:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!