質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • C#

    4777questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

byte[] bytes = {0,0,24,40};の合計は88?

解決済

回答 5

投稿 2017/11/28 23:04

  • 評価
  • クリップ 0
  • VIEW 411

nomurax

score 6

こんばんは。
byte[] bytes = {0,0,24,40};
このとき、16進で合計するには、どういう式を立てればよいですか?
現在、10進数で合計していて、88になっています。
var size = 8 * bytes[0] + 4 * bytes[1] + 2 * bytes[2] + bytes[3];
と計算しています。

C#です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2017/11/28 23:07

    「var size = 8 * bytes[0] + 4 * bytes[1] + 2 * bytes[2] + bytes[3];」これは一体何をしているつもりですか?

    キャンセル

回答 5

+4

こんにちは。

日常生活とコンピュータの間にある大きな断絶の一つですので非常に勘違いしやすいのですが、10進数や16進数は数値を人が読めるように表現したものですから文字列です。コンピュータにとっては数値ではないのです。
そして、byte型は文字ではありませんのでbyte配列で10進数や16進数を表現することはできません。

例えば、10進数文字列で表現された値をint型等へ変換して各種演算を行い、その結果を16進数文字列へ変換するような操作は可能です。

投稿 2017/11/29 00:22

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/29 09:07

    おはようございます。コメントありがとうございます。
    しかしながら、Visual Studioでブレークポイントで見ていると、上記のとおり、bytes[0]と[1]には0が、[2]には24が[3]には40が入っていて、int sizeに足し算できて、合計88になっています。
    byte型の中身は足し算できるのでintではないかと思いますが、違いますか?
    24と40は(たぶん)10進数なので、24を16進数にして、40も16進数にして、足したいです。
    Webを調べると、10進数を16進の文字にすることはできるみたいなのですが、16進の数値にするところがわかりませんでした。
    ご回答いただいたのだと、10進数の文字をintに変換するとのことですが、それはすでにできていると思います。各種演算も2×24+40=88なのでできています。その結果を変換したいのではなく、事前に24と40を16進の数値に変換して足し算したいです。

    キャンセル

  • 2017/11/29 11:12

    > byte型の中身は足し算できるのでintではないかと思いますが、違いますか?

    int型は32ビットの整数です。byteは8bitの符号なし整数です。どちらも整数ですので演算できます。

    > 24と40は(たぶん)10進数なので

    自然言語で表現した24と40は一般に10進数ですね。byte型の内部表現は10進数ではありません。ほとんどの場合トランジスタのONとOFFを用いて2進数として表現しています。

    > 10進数を16進の文字にすることはできるみたいなのですが、16進の数値にするところがわかりませんでした。

    C#は「16進の数値」をサポートしていません。(といいますか、これをサポートしているプログラミング言語はレアと思います。少なくとも私は見たことは有りません。)

    > 事前に24と40を16進の数値に変換して足し算したいです。

    もし、何らかの教育用プログラム等で必要なのであれば、16進文字列同士の足し算プログラムをご自身で作るしかありません。

    キャンセル

  • 2017/11/29 11:29

    2進数として表現しているということですが、24は10進数に見えます。2進数だと0と1しかないですよね?

    キャンセル

  • 2017/11/29 11:40

    コンピュータの内部表現を覗くことができれば 2進数で表現されています。(トランジスタのON/OFFを目で見るのは難しいですが。)ですので、それを人が目で見える姿で表示するプログラムが内蔵されています。(そんなものなかった大昔は、LEDを光らせて2進数で表示してました。)
    そして、人は2進数の取り扱いになれていないので、コンピュータの方で10進数文字列へ変換して表示しています。

    キャンセル

+4

byte x = 15;

これはxに10進表記だと15になるを代入するという意味なので
xに16進表記だとFになるを代入するという意味でもあり
xに2進表記だと1111になるを代入するという意味でもあります。

デバッガで変数の中身を見るときは人間様がわかりやすいように10進を選んで表記してくれてるだけです。


var size = 8 * bytes[0] + 4 * bytes[1] + 2 * bytes[2] + bytes[3];

ひょっとして4byteの符号なし整数のバイト配列表現を元の整数に戻したいという話なら
var size = 16777216 * bytes[0] + 65536 * bytes[1] + 256 * bytes[2] + bytes[3];

ですし、普通はBitConverter使って変換します。

投稿 2017/11/29 11:51

編集 2017/11/29 12:57

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/29 12:01

    なるほど。そうなんですね。見えるようにしてくれているんですね。

    キャンセル

  • 2017/11/29 13:20

    コメント追記ありがとうございます。
    まさにそれでした。期待する値を取得できました。
    2進数なのだから、2、4、8をかけて足すのかと考えていましたが、違いました。ご推察のように256、65536、16777216をかけるのでした。
    ベストアンサーです。解決しました。
    ベストアンサーを変更する方法がわからないので恐縮です。

    ちなみに、x_xさんにもBitConverterをご示唆いただいて、ページを見て、使ってみたのですが、うまく動きませんでした。
    というのは、
    int size = BitConverter.ToInt32(bytes, 0)といれるらしいのですが、今回のbytesは長さが長く<6000とか8000とかあるいはもっと)そのうちサイズを示すのは先頭の4つだけなのです。
    int size = BitConverter.ToInt32(bytes, 0)といれると、13となる値が、218103808とかになってしまってだめでした。
    int size = BitConverter.ToInt32(bytes, 0, 4)とかでスタート位置(0)と読み取る数(4)を指定できるかと模索してみましたがだめでした。
    あらかじめ、配列から先頭4つぶんを別の配列にする処理が必要なのか…と、考えていたところでした。
    ありがとうございます。

    キャンセル

  • 2017/11/29 14:53

    エンディアンの違いですね

    キャンセル

+2

BitConverterですかね?
https://msdn.microsoft.com/ja-jp/library/system.bitconverter.toint32(v=vs.110).aspx

16進で……と言っているのがよくわからないので、この辺を読んで何をしたいのか伝えてもらえたらいいかもしれません。

投稿 2017/11/29 10:01

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

そもそも

byte[] bytes = { 0, 0, 24, 40 };


では、bytes の中身は
bytes[0] = 0
bytes[1] = 0
bytes[2] = 24
bytes[3] = 40
なのですから、これを式に従って計算すれば、8*0 +4*0 + 2*24 +40 = 48+40=88 で、何ら間違ってはいません。
bytes の中身を 16進数で 与えたい(24 が16進数での24 = 10進数での36)なら、

byte[] bytes = { 0x0, 0x0, 0x24, 0x40 };


としなければいけません。

投稿 2017/11/29 11:52

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/29 11:57

    検算ありがとうございます。なるほど。式はあっている、ということですね。ということは、式の立て方を間違えているようです。

    キャンセル

0

基本的に、現在のコンピュータでの内部的な計算は全て2進数で行われるかと思います。
10進数や16進数で計算するということのイメージを伝えられないと、望む回答は来ないかと思います。

画面への計算結果の表示内容を88ではなく0x58等としたいということでしょうか。
Visual Studioのウォッチ ウィンドウで上記の変換された表示をしてほしいということでしょうか。

投稿 2017/11/29 10:10

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • C#

    4777questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。