2017-06-09 10 views
1

私はvftableのオフセットがあるアドレスを持っています。アセンブリとしてバイトとして格納されます。 ex:03 c3 bd 0cアドレスのバイト配列をキャスト/変換

バイトを取得してリトルエンディアンスタイルをアドレスに変換したいとします。

byte[0] = ((unsigned char *)addr)[3]; 
byte[1] = ((unsigned char *)addr)[2]; 
byte[2] = ((unsigned char *)addr)[1]; 
byte[3] = ((unsigned char *)addr)[0]; 

ですので、例の出力は0x0cbdc303になります。

これを正しくコードするにはどうすればよいですか?

+0

私はこのことを、少なくとも原則として、重複していると言いました。驚くべきことに、[良い答えが与えられました](https://stackoverflow.com/a/20756148/1856738)でも、[ここ](https://stackoverflow.com/q/20755897/1856738)で選択された不稼動の回答がありました。 )、[ここでは答えは一切選択されていませんでした](https://stackoverflow.com/q/7879953/1856738)。今OPが本当に望んでいたことについて2人の人が争っているのを見ています...これはホットトピックのように見えます...正しい答えを選んでください(今は操作をシフトすることについて学んでいます)... –

答えて

0
byte[0] = ((unsigned char *)addr)[3]; 
byte[1] = ((unsigned char *)addr)[2]; 
byte[2] = ((unsigned char *)addr)[1]; 
byte[3] = ((unsigned char *)addr)[0]; 

はあなたがbyte[]を取り除くことができます。もちろん、

uint32_t address = (byte[0] << 24)|(byte[1] << 16)|(byte[2] << 8)|(byte[3]); 

が続くべきであると、このに元の値を置き換えます。これは、簡単にこの方法を行うことができます。

+0

...リトルエンディアンマシン(コードで正しい番号を取得する必要があります)、これは私の答えの遅いバージョンです(おそらくあなたによってdownvotedされました)。 – deviantfan

+0

@deviantfanスワップバイト。彼はそう言います。質問を読む。 – EJP

-1

リトルエンディアンデバイスを使用しており、4つのリトルエンディアンバイトを1つの4バイト数に変換したいとします。

uint32_t myNumber = *((uint32_t *)addr); 
+0

OPのコード。 – EJP

+0

@EJP Imho OPは、スワッピングについては尋ねなかったが、バイトから数値を取得することについて尋ねた。 OPはちょうど推測スワッピングが必要です。 – deviantfan

+0

質問を読むOPには0x03c3bd0cがあり、0x0cbd3c03が必要です。交換することなくそれを遵守するのは難しいです。 – EJP

関連する問題