- ベストアンサー
DWORDからWORD、BYTEに
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最も簡単な方法はunionを使います。 union { DWORD d; WORD w[2]; BYTE b[4]; } u; u.d = 元の値; u.w[0] → 元の値の下位WORD値 u.w[1] → 元の値の上位WORD値 u.b[0] → 元の値の最下位BYTE値 u.b[3] → 元の値の最上位BYTE値 上記はIntelのようなリトルエンディアンの場合です。 ビッグエンディアンのCPUでは上位下位が反対に なります。 尚、下位16ビットだけ、上位16ビットだけなら シフトでも処理できます。 DWORD d; WORD w; BYTE b; w = (WORD)d; //下位16ビット w = (WORD)(d>>8);//上位16ビット b = (BYTE)d; //最下位8ビット b = (BYTE)(d>>24);//最上位8ビット こちらはエンディアンに影響されません。
その他の回答 (3)
- chie65535
- ベストアンサー率43% (8507/19342)
移植性が皆無になるので、C言語では「やっちゃいけないこと」に分類されるけど #ifdef _little_endian #define _LOWW 0 #define _HIW 1 #define _LLB 0 #define _LHB 1 #define _HLB 2 #define _HHB 3 #else #define _LOWW 1 #define _HIW 0 #define _LLB 3 #define _LHB 2 #define _HLB 1 #define _HHB 0 #endif union WordU { DWORD dd; WORD wd[2]; BYTE bd[4]; }; void main(void) { union WordU d; DWORD dword = 0x01234567; WORD lowword; BYTE lowlowbyte; d.dd = dword; lowword = d.wd[_LOWW]; lowlowbyte = d.bd[_LLB]; } って方法もある。
お礼
ありがとうございました。 Cではやっちゃいけないことになっているんですね…勉強になります。 構造体で宣言されたDWORDだったのでunionを使った分割方法は控えさせていただきました。
- FAY
- ベストアンサー率49% (95/193)
ビット演算でやってもいいんですがマクロを使うとより楽かな。 DWORDを二つのバイトにするにはHIWORDおよびLOWORD、 BYTE4つにするにはHIWORDおよびLOWORDで取得したWORD値に対して それぞれHIBYTEとLOWORDを使うとかね。 DWORD dwData = 0x12345678; WORD wData1 = HIWORD(dwData); WORD wData2 = LOWORD(dwData); BYTE byData1 = HIBYTE(wData1); BYTE byData2 = LOBYTE(wData1); BYTE byData3 = HIBYTE(wData2); BYTE byData4 = LOBYTE(wData2); とか。
お礼
とても分かりやすく教えていただき、ありがとうございます。 すでにビット演算でばらばらにする方法を選択させていただいたのですが、 マクロを使うとプログラムが短縮化できそうですね。 あとは処理速度比較でしょうか。。。。 この点は要調査ですね。
- D-Matsu
- ベストアンサー率45% (1080/2394)
DWORD/WORD/BYTEともCの標準型ではありませんからコードはそれぞれの定義次第です。 が、とりあえずビット論理積演算とビットシフトが出来るようになれば作ることはできるはずです。
お礼
ありがとうございます。 Cの標準型でないのは分かったのですが、何か簡単な解決方法が無いかと思いまして。。。 とりあえず、ビットシフトを繰り返して分ける方法を選択しました。
関連するQ&A
- この”void (*m_pViewMode)(BYTE,BYTE,WORD);”このソースコードの意味は?
今、みているソースコードで次のようなコードがありました。 void (*m_pViewMode)(BYTE,BYTE,WORD); --------(中略)---------------------------- m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time); 全く何をどうやっているのかよくわからないのですが、これはC言語ではどのようなことをやっているソースコードなのでしょうか? ご存じの方いらっしゃいましたらご教授お願いいたします。
- ベストアンサー
- C・C++・C#
- byte[2] から int へ。
それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、 byte[0] = 0x01; byte[1] = 0x01; ならば、 00000000 00000000 00000001 00000001 で、256 + 1 = 257 byte[0] = 0x02; byte[1] = 0x10; ならば、 00000000 00000000 00000010 0000011 で、512+3 = 515 です。byteの値が0~127の場合は int n = byte[0] << 8 n = n | byte[1] という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。 byte[0] = 0x01; byte[1] = 0xFF; のときは、 00000000 00000000 00000001 11111111 で、256+255 = 511 としたいのですが、場合わけをせずに求める よい方法はないでしょうか。
- ベストアンサー
- Java
- C# int→byte のキャスト
プログラミング初心者です。 int型の変数に255以上の値を代入し、byte型の変数にcastするとbyte型の変数に代入される値はint変数の値から256を引いた値になります。なぜですか、またどういう仕組みでcastは行われるんですか?
- ベストアンサー
- C・C++・C#
- byteをDBに格納
sqlserver 2008 framework3.5 SP1 C# すみません。 C#初心者です。上の情報で十分ですか? いま、データをDBに格納したく奮闘しております。 まず、格納したいものは、以下のような16進数のデータです。 「1E0015・・・」 いまはbool配列に{0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1・・・}のデータを8個ずつ int配列に{30, 0, 5,・・・}と変換して byte配列に{1E,0,15・・・}と変換しています。 bool配列からbyte配列に変換する方法はありますでしょうか? また、byte配列のDBへの格納方法も合わせてお教えいただけると助かります。 よろしくおねがいします。
- 締切済み
- C・C++・C#
- EXCEL VBA Byte型に"0"を付けたい
EXCEL VBAにてあるセルの値をByte型の16進数に 変換していますが、変換後の値の頭に"0"が付かなくて 困っています。 Dim a As String Dim aa As String Dim b As Byte Dim bb As Byte a = Val("&H" & Cells(1, 1)) aa = Format(a, "00") b = aa bb = Format(b, "00") 変数など簡略化していますが、こんな感じです。 最後の"bb"の中身が、例えば"01"ではなく"1"と なってしまっています。 バイナリエディタで表示した時に、"111"ではなく "010101"と表示させたいのですが、、、 この方法にこだわっている訳ではないので 他の方法も含めて、ご教示お願いします。
- ベストアンサー
- Excel(エクセル)
- int型の内容をbyteの配列にコピー
int型の内容をbyteの配列にコピーする方法を教えて下さい。 int i_value = 500; byte[] by_value; by_value = new byte[4]; // どのような処理が必要ですか? by_value[0]には、0x1 by_value[1]には、0xf4 と格納したいです。 数字→文字列→文字(byte)できたのですが…。 C言語の場合、memcpy関数で型が異なってもキャストすれば回避できました。 JAVAでの方法を教えて下さい。
- ベストアンサー
- Java
- C言語の構造体をpythonでやりたい
現在ラズベリーパイでpythonでTCPクライアントを作っています。 現在サーバーに次のようなパケットを送信したいと思っているのですが、このC言語の構造体を同じバイト数で出力するようにpython言語にすることは可能でしょうか? どうぞ、ご教示いただきますよう、宜しくお願い致します。 typedef struct _PAYLOAD_ALIVE_ { BYTE MacAddr[6]; WORD Port; BYTE Relay; BYTE Set; BYTE AliveTime; BYTE SensorLen; BYTE Mail[40]; WORD Model[20]; BYTE testArea[4]; BYTE SWVer[4]; BYTE testSensor[16]; }PL_ALIVE;
- ベストアンサー
- C・C++・C#
- 【JAVA】CharをByteに変換したい。
JAVAで、CharをByteに変換したいです。 以下の様なメソッドを用意して通してたのですが -------------------------------------- public static byte[] Char2Bytes(char c){ int i = (int)c; return new byte[] { (byte)(i >> 8), (byte)(i & 0x00ff) }; -------------------------------------- 「a」などの場合、このメソッドを通すと「 a」となってしまいます。 他に変換する方法などないでしょうか? または、上記で「 a」とせず「a」にする方法はございますか? #byte[0]の中身が「0」であればの判定以外で
- 締切済み
- Java
- C#のキャストについて(object→byte)
いつもお世話になっております。C#初心者です。 「メソッドの引数として渡された値をリスト型の配列に格納する」という課題に取り組んでいますが、 変数のキャストで実行時にエラーが発生し、頭を悩ませています。 作成したコードは以下のようになっています。 public class TestClass { private List<byte> hogeList = new List<byte>(); public void TestMethod( object hoge ) { hogeList.Add( (byte)hoge ); ← (*) } } 上記のメソッドをMain関数から TestClass test = new TestClass(); test.TestMethod(5); として実行すると、「hogeList」に「5」が格納される、といった動作にしたいと考えています。 しかしながら、ビルドは通るのですが、実行すると(*)の位置で止まり、 「指定されたキャストは有効ではありません。」 というメッセージが表示されます。 そこで質問なのですが、object型からbyte型にキャストする場合にはどのような記述の仕方がありますでしょうか? ご教授よろしくお願いいたします。
- 締切済み
- その他(プログラミング・開発)
お礼
分かりやすいご回答ありがとうございました。 なるほど、環境依存型だそうですがunionという方法もあるんですね。。。 勉強になりました。 今回は既に構造体の中に組み込んだDWORDだったので、ビット演算で1ビットずつ分けて行く方法を取らせていただきました。 ありがとうございます。