char配列から指定バイトだけ切り出したい(memcpyなど使わずに)
この配列に何かバイナリデータが入っているとします。
char c[9]
これの先頭3バイトをintの変数に入れたいのですが、mem~系の関数を使わずに実現することは可能ですか?
ちなみに4バイト目以降は無傷で残しておきたいです。
【追記】
意味の分かりづらい質問ですいません。
このような感じです。エンディアンに関してはバイトオーダーの関数は後で使って調整できるものとします。なのでとにかくintに入れれば大丈夫です。
int n = 0;
char cc[4] = { 0xe8, 0x03, 0x00, 0x00 }; //数字の1000
memcpy(&n, cc, 3); // 3バイト取り出して1000を復元する
回答していただいた方々、ありがとうございます。
sanadanさんのコードをベースに下記の方法で数値を復元することができました。
char c[4] = {0x00,0x00,0x06,0x00}; // int6のネットワークバイトオーダー(3バイト目まで)
int x = (*(int *)c) & 0xffffff; // この時点で0x00,0x06,0x00,0x00になる
x = x << 8; // 3桁しか使わない
x = ntohl(x); // オーダー解決
yoh2さんの方法を使えばバイトオーダーも同時に解決できそうですね。
ご回答していただいた通り、このようなことをするよりも素直にmemcpyを利用しようかとも思っています。
【さらに追記】
よく考えたら任意の場所から取り出して最後の3バイトを取り出す場合もありそうなので、やはり上記コードは使えなさそうです。
最初の意図を明確にしておくと、
インプットデータはネットワークバイトオーダーのバイト配列でした。
それの3バイト目までをintとして扱いたいマシンはリトルエンディアンマシン。。でしたが、この質問を書き、回答を読んで将来ビッグエンディアンで使う可能性もあると思い直しました。
なので、ビットシフトなどは今回の用途では使わない方向でいきます。