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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

5回答

4683閲覧

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

nomurax

総合スコア32

C#

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

0グッド

0クリップ

投稿2017/11/28 14:04

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

C#です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/11/28 14:07

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

回答5

0

C#

1byte 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 02:51

編集2017/11/29 03:57
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomurax

2017/11/29 03:01

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

2017/11/29 04: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つぶんを別の配列にする処理が必要なのか…と、考えていたところでした。 ありがとうございます。
ozwk

2017/11/29 05:53

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

0

こんにちは。

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

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

投稿2017/11/28 15:22

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomurax

2017/11/29 00: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進の数値に変換して足し算したいです。
Chironian

2017/11/29 02: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進文字列同士の足し算プログラムをご自身で作るしかありません。
nomurax

2017/11/29 02:29

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

2017/11/29 02:40

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

0

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

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

投稿2017/11/29 01:01

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そもそも

C#

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

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

C#

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

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

投稿2017/11/29 02:52

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomurax

2017/11/29 02:57

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

0

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

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

投稿2017/11/29 01:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問