こちらの質問・解答はいつも勉強させられています。
この度は一つ、質問をさせてください。
char型の変数の先頭4byteにint型のデータをいれたいのですが、
どうにも上手くいきません。
#define HEADER_SIZE 4
struct tPARA_DATA
{
int x;
int y;
};
char SendData[ sizeof( tPARA_DATA ) + HEADER_SIZE];
ZeroMemory(SendData, sizeof(SendData));
SendData[0] = 180;
memcpy( &SendData[HEADER_SIZE], (BYTE *)&pSend, sizeof( tPARA_DATA) );
このようにすると、先頭1byteにはデータがはいるのですが
のこり3byteがあまってしまいます。
また、1byteへint型4byteを入れようとすると、ERROR(C4305: '=' : '' から 'char' へ切り詰めます。)
とでて、数字がおかしなものになってしまいます。
どうにかうまく解決する方法はないでしょうか?
char型変数の先頭4byteにint型を入れたい
Re:char型変数の先頭4byteにint型を入れたい
(想像はつきますが)処理系が不明ですので、まともな回答はできません(あるいは非常に面倒です)。
望んでいる結果を得るには、境界調整やバイトオーダーに留意する必要があるからです。
望んでいる結果を得るには、境界調整やバイトオーダーに留意する必要があるからです。
Re:char型変数の先頭4byteにint型を入れたい
やりたいことが余りにも分かりません。
charが符号無しで、intのサイズを4で、リトルエンディアンで、構造体のパディングを0であり
pSend.x=1
pSend.y=2だったとします(順番もx,y)
するとSendDataはバイト的に考えて
| 180 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 |
のようになるのは分かりますか?
charが符号無しで、intのサイズを4で、リトルエンディアンで、構造体のパディングを0であり
pSend.x=1
pSend.y=2だったとします(順番もx,y)
するとSendDataはバイト的に考えて
| 180 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 |
のようになるのは分かりますか?
Re:char型変数の先頭4byteにint型を入れたい
以下のようなことかと思いますが、みなさん仰っているように環境依存が心配です。
void main(void) {
char buf[4];
*((int*)&buf[0])=300;
printf("%d\n",*((int*)&buf[0]));
}
私ならですが、以下のような構造体にすると思います。的外れかもしれませんが。
struct hoge {
struct tPARA_DATA {
int x;
int y;
};
int header;
tPARA_DATA data;
};
void main(void) {
char buf[4];
*((int*)&buf[0])=300;
printf("%d\n",*((int*)&buf[0]));
}
私ならですが、以下のような構造体にすると思います。的外れかもしれませんが。
struct hoge {
struct tPARA_DATA {
int x;
int y;
};
int header;
tPARA_DATA data;
};
Re:char型変数の先頭4byteにint型を入れたい
int型が4バイトだとわかっているのであれば、境界調整やバイトオーダーに関係なく、次のようにすれば何とかなります。
int t = 180;
memcpy(&SendData[0], &t, 4);
もちろんint型が4バイトとは限りませんし、下位ビットだけを転送するというのであればバイトオーダーが重要になってきます。
int t = 180;
memcpy(&SendData[0], &t, 4);
もちろんint型が4バイトとは限りませんし、下位ビットだけを転送するというのであればバイトオーダーが重要になってきます。