Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。1万件30この配列に何かバイナリデータが入っているとします。c[9]これの先頭3バイトをintの変数に入れたいのですが、mem~系の関数を使わずに実現することは可能ですか?ちなみに4バイト目以降は無傷で残しておきたいです。意味の分かりづらい質問ですいません。エンディアンに関してはバイトオーダーの関数は後で使って調整できるものとします。intに入れれば大丈夫です。3バイト取り出して1000を復元する回答していただいた方々、ありがとうございます。sanadanさんのコードをベースに下記の方法で数値を復元することができました。オーダー解決yoh2さんの方法を使えばバイトオーダーも同時に解決できそうですね。ご回答していただいた通り、このようなことをするよりも素直にmemcpyを利用しようかとも思っています。【さらに追記】よく考えたら任意の場所から取り出して最後の3バイトを取り出す場合もありそうなので、やはり上記コードは使えなさそうです。最初の意図を明確にしておくと、インプットデータはネットワークバイトオーダーのバイト配列でした。それの3バイト目までをintとして扱いたいマシンはリトルエンディアンマシン。この質問を書き、回答を読んで将来ビッグエンディアンで使う可能性もあると思い直しました。ビットシフトなどは今回の用途では使わない方向でいきます。個の銅バッジ1質問の意味がよくわかりません。memcpyを使用した場合のコードを提示してください。キャストするのは止めた方がいいですよ。境界にない場合が未定義のため。例外が発生してプログラムが止まる例や、何事もなかったかのように進むけど、実際は近くのint境界を始点として取って来た値になる例に遭遇したことがあります。15:17もうふたつ。通す前にマスクやシフトを行うやり方では、ビッグエンディアンなアーキテクチャでは期待と異なる結果になります。15:23(2)で大丈夫です。整数値としてあらわした際に、元のバイト配列の3バイト目が1桁目、1バイト目が3桁目になっていれば大丈夫です。リトルエンディアンのマシン前提で考えていました。たしかにシフトを行う前提でコードを書くのはまずいですね。素直にmemcpyを使おうと思います。ありがとうございました。票1一旦都合の良い形にコピーしてからntohlするのはいかがでしょうか。6すでに検討済みであったり、そもそもコピー先のメモリが惜しいという可能性がありますが、念のため投稿します。個の銅バッジはい、けっきょく自分もその結論に落ち着きました。自分でバッファを用意してネットワークバイトオーダーの形にきちんと直してからコピーして、その後にntohl()を呼びます。示していただいたコードの通りです。これが一番安全で確実です。その必要がなければ、最初から望みの値を得られるよう、以下のようにすればいいと思います。バイトまでのパターンが有り得るならこんな感じで。パターンもありそうです。意図しているように見えます。その場合ならこうですね。|5memcpy()を避ける意義はなぜでしょう?というのも今どきのコンパイラはmemcpy()の意味を知っていて直接インライン展開してしまいます。複雑な記述をするよりはmemcpy()でシンプルに記述した方がいいように思います。個の銅バッジmemcpy(),strcpy()などは領域の重複時が未定義のためだと思います。最小限のメモリで予期しない動作を含まないプログラムを考えているのだと思います。今回の場合もそうですが別変数などソースレベルで重複しないことが明らかなパターンは多々あると思います。重複を前提とするならばmemcpy()の代わりにmemmove()が用意されています。0:54上はmemcpyでさじを投げていたので、コメントしました。それと、これは、質問が課題という雰囲気がありますので、質問の方に明日投票しますね。(サンプルを書いて正しく動かなかったら+簡単に動いたら-という感じで、エンディアンまで触れられてると今更間違えることもないでしょうが。|33バイトmemcpyするのと同等のコードです。0xffffff;で、任意のiの位置から3バイトをintで取得できますが、どうでしょう?但し、最後の3バイトを取り出す場合があると、これはオーバーランしてしまって使えませんが。int境界にないことがあるため未定義動作だと思います。|2面白そうな課題「mem~系の関数を使わずに文字列リテラルのビット列が示す整数値を表示せよ」として書いてみました。自己満足ですが何かのお役に立てればと思います。uint16_tを使って判定しリトルエンディアンと似た処理になるかと。どこまで正常に動くかは未確認です。これについてはデバッグできない。関係がない内容だった。いつもよりレベルが高くとても勉強になった。|0過去に似たような事をした人がPRJにいて奇々怪々なセグメンテーション違反が発生して2日間不具合に悩まされたことがありました。ほかの方が書いているようにint境界にないと動作は未定義ですからntohl()したうえでビットシフトとビットマスクすることがビッグエンディアン等プラットフォーム依存しないコードの記述だと思います。|-5たぶんこれでいけると思います。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。どのような違いがありますか9char型のハミング重みとハミング距離を計算したい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。