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

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

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

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

Q&A

解決済

3回答

1355閲覧

byte[] intの変換で、いろいろ疑問

nomurax

総合スコア32

C#

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

1グッド

0クリップ

投稿2017/12/13 05:18

編集2017/12/13 05:21

###前提・実現したいこと
こんにちは。いつもたいへんお世話になります。
byte[] intの変換で、コンソールアプリケーションを作っていろいろ試しています。
そこでいろいろ疑問が出てきました。

C#

1 byte[] bytes = { 5, 12, 24, 40, 58 }; 2 var size = 16777216 * bytes[0] + 65536 * bytes[1] + 256 * bytes[2] + bytes[3];//Q1 3 Console.WriteLine("convert1600 size="+size); 4 5 byte[] size1 = BitConverter.GetBytes(size / 16777216);//Q2, Q3 6 byte[] size2 = BitConverter.GetBytes(size % 16777216 / 65536); 7 byte[] size3 = BitConverter.GetBytes(size % 16777216 % 65536 / 256); 8 byte[] size4 = BitConverter.GetBytes(size % 16777216 % 65536 % 256); 9 10 11 List<byte> afterbytes = new List<byte>(); 12 afterbytes.AddRange(size1); 13 afterbytes.AddRange(size2); 14 afterbytes.AddRange(size3); 15 afterbytes.AddRange(size4); 16 17 List<byte> afterbytes2 = new List<byte>(); 18 afterbytes2.Add(size1[0]); 19 afterbytes2.Add(size2[0]); 20 afterbytes2.Add(size3[0]); 21 afterbytes2.Add(size4[0]); 22 23 var sizebyte1 = size / 16777216; 24 var sizebyte2= size % 16777216 / 65536; 25 var sizebyte3= size % 16777216 % 65536 / 256; 26 var sizebyte4= size % 16777216 % 65536 % 256; 27 28 List<byte> afterbytes3 = new List<byte>(); 29 //afterbytes3.Add(sizebyte1);//Q4 30 //afterbytes3.Add(sizebyte2); 31 //afterbytes3.Add(sizebyte3); 32 //afterbytes3.Add(sizebyte4); 33 34 byte[] bytesarray = bytes.ToArray(); 35 int bitconvertersize32 = BitConverter.ToInt32(bytesarray, 0); 36 Console.WriteLine("int bitconvertersize=" + bitconvertersize32); 37 byte[] bytesbybitconverter1 = BitConverter.GetBytes(bitconvertersize32);//Q5, Q6,Q7 38 39 byte[] bytesbybitconverter = BitConverter.GetBytes(size); 40

###発生している問題/疑問
Q1)16777216や65536や256はどこから出てきたのか?
Q2)intをGetBytesすると、なぜ4つずつの組の配列になるのか?
Q3)組の配列の[1],[2],[3]は0,0,0だがつねに0なのか?
Q4)List<byte>にintをAddできないが、intをbyteに変更する方法は? BitConverterを使う?
Q5)BitConverter.GetBytesを使うと16777216や65536や256はどこに消えるのか?
Q6)ひょっとしてbytesはつねに4つの組の配列であり、16777216や65536や256がデフォルトなのか?
Q7)戻すと配列は、{5,12,24,40}となるが58はどこに消えたのか?
4つずつなら次のようにすればどうかと思ったが、これでも後半の58,63,71.86はなくなる。
List<byte> bytes = new List<byte>({5,12,24,40,58,63,71,86});

お知恵拝借したいです。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10 Home 1709 64bit

Microsoft Visual Studio Community 2017
Version 15.1 (26403.3) Release
VisualStudio.15.Release/15.1.0+26403.3
Microsoft .NET Framework
Version 4.7.02556

インストールされているバージョン:Community
Visual C# 2017 00369-60000-00001-AA631

matobaa👍を押しています

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

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

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

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

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

ozwk

2017/12/13 05:19

コードは‘‘‘ ではなく```(日本語キーボードならShift+@)で囲ってください
aglkjggg

2017/12/13 06:15 編集

変数型やエンディアン、2進数16進数n進数について勉強した方がいいと思います。原理を知らなければ永遠に解決しない問題です。また、過去にも似た質問をしていて今回の質問はその続きかと思うのですが何故新しい質問として作ったのでしょうか…?
guest

回答3

0

ベストアンサー

Q1)16777216や65536や256はどこから出てきたのか?

16777216 = 0x1000000 = 0x100 * 0x100 * 0x100 65536 = 0x10000 = 0x100 * 0x100 256 = 0x100

10進数: 12と34を入力して1234を出力する時は12 * 100 + 34 * 1
16進数: 0xABと0xCDを入力して0xABCDを出力する時も同様に0xAB * 0x100 + 0xCD * 1

Q2)intをGetBytesすると、なぜ4つずつの組の配列になるのか?

C#のintが32bit = 4byteだから

Q3)組の配列の[1],[2],[3]は0,0,0だがつねに0なのか?

1byte分の入力しか入れてないから

byte[] size1 = BitConverter.GetBytes(size / 16777216); byte[] size2 = BitConverter.GetBytes(size % 16777216 / 65536); byte[] size3 = BitConverter.GetBytes(size % 16777216 % 65536 / 256); byte[] size4 = BitConverter.GetBytes(size % 16777216 % 65536 % 256);

32bitの変数sizeに対して0x1000000で割ると、出て来る数は-128~+127

size % 16777216 これは上位8bitを削って下位24bitを出してるのでそこから2の16乗で割ると出て来る数は-128~+127
以下同様

削ぎ落とさずに

byte[] le_size = BitConverter.GetBytes(size);

でよい

Q4)List<byte>にintをAddできないが、intをbyteに変更する方法は? BitConverterを使う?

BitConverterでもキャストでもお好きにどうぞ

Q5)BitConverter.GetBytesを使うと16777216や65536や256はどこに消えるのか?

12345 という十進数は 1 * 10000 + 2 * 1000 + 3 * 100 + 4 * 10 + 5 * 1で表せる
12345 から 1,2,3,4,5を取り出す過程で10のn乗は使われている
(2のn乗進数の場合bitシフトでやるけどね)

Q6)ひょっとしてbytesはつねに4つの組の配列であり、16777216や65536や256がデフォルトなのか?

後半意味わかんないけど、ハードコーディングされてるという意味ではYES
bytesは常に4つの組 intに変換してる以上YES

Q7)戻すと配列は、{5,12,24,40}となるが58はどこに消えたのか?

intが32bitなので消えました

List<byte> bytes = new List<byte>({5,12,24,40,58,63,71,86});

としたとき、
ひょっとして、それは、
List<List<byte>> bytess = new List<List<byte>>({{5,12,24,40}, {58,63,71,86}});
みたいに

4byte毎にintに変換したいのかバイト列の一部をintに変換したいのか
見失ってませんか?

投稿2017/12/13 05:57

編集2017/12/13 07:18
asm

総合スコア15147

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

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

nomurax

2017/12/13 06:17

ありがとうございます。 Q1-1)お伺いしたかったのは、2の乗数には、2^4の16や2^15の32000とかもあると思うのですが、なぜ256と65536と16777216だけなのでしょうか? Q3)1byteを越える入力を入れるにはどんな値にすればよいのですか? Q6、7)で、 List<byte> bytes = new List<byte>({5,12,24,40,58,63,71,86}); としたとき、 ひょっとして、それは、 List<List<byte>> bytess = new List<List<byte>>({{5,12,24,40}, {58,63,71,86}}); みたいに書く、ってことでしょうか? List<List<byte>> bytess = new List<List<byte>>(); List<byte> bytes1 = new List<byte>({5,12,24,40}); List<byte> bytes2 = new List<byte>({58,63,71,86}); bytess.Add(bytes1); bytess.Add(bytes2); というような。
nomurax

2017/12/13 09:23

ありがとうございます。 4byteごとにintに変換するのと、バイト列の一部をintに変換するのとでは違うのですか? やりたいのは、byte[] → int → byte[]で、もとの値に戻すこことです。 現在は、元に戻すと58が消えてしまうので困っています。 消えない方法を知りたいです。
asm

2017/12/13 09:41

> 4byteごとにintに変換するのと、バイト列の一部をintに変換するのとでは違うのですか? 似て非なる問題です。 > やりたいのは、byte[] → int → byte[]で、もとの値に戻すこことです。 intには4バイトまでしか入らないので 5バイト以上は無理です。 byte[] → int[] + バイト列の長さ情報 → byte[] もしくは元のバイト列の長さが4の倍数であるという前提がある事で byte[] → int[] → byte[] が可能です
nomurax

2017/12/16 09:52

はい。ほしいのは、 byte[] → int[] + バイト列の長さ情報 → byte[] もしくは元のバイト列の長さが4の倍数であるという前提があるうえで byte[] → int[] → byte[] であることに気づきました。 ありがとうございます。
guest

0

疑問の数々はともかく int は 4 バイトなので 5 バイトの情報を収めることはできません。
long を使ってください。

バイト列と long の相互変換についてはこちら
方法: バイト配列を int に変換する (C# プログラミング ガイド)

投稿2017/12/13 23:44

Zuishin

総合スコア28660

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

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

0

Q1)16777216や65536や256はどこから出てきたのか?
Q3)組の配列の[1],[2],[3]は0,0,0だがつねに0なのか?

2の8乗(1byteで表せる数の限界+1)、
2の16乗(2byteで表せる数の限界+1)、
2の24乗(3byteで表せる数の限界+1)

Q2)intをGetBytesすると、なぜ4つずつの組の配列になるのか?

C#のintは32bit(=4byte)符号付き整数だから

Q4)List<byte>にintをAddできないが、intをbyteに変更する方法は? BitConverterを使う?

intのバイト配列表現をList<byte>にAddしたいならそう。

Q5)BitConverter.GetBytesを使うと16777216や65536や256はどこに消えるのか?

消えるも何も使ってない。

C#

1byte[] bytes = { 5, 12, 24, 40, 58 }; 2// 中略 3byte[] bytesarray = bytes.ToArray(); 4int bitconvertersize32 = BitConverter.ToInt32(bytesarray, 0); 5// 中略 6byte[] bytesbybitconverter1 = BitConverter.GetBytes(bitconvertersize32);//Q5,

Q6)ひょっとしてbytesはつねに4つの組の配列であり、16777216や65536や256がデフォルトなのか?

何をbyte列表現に変換するかによる。

Q7)戻すと配列は、{5,12,24,40}となるが58はどこに消えたのか?

消えるも何も使ってない。

C#

1byte[] bytes = { 5, 12, 24, 40, 58 }; 2// 中略 3 4int bitconvertersize32 = BitConverter.ToInt32(bytesarray, 0); // intは4byteだから[0]~[3]までしか使われない

投稿2017/12/13 05:37

編集2017/12/13 05:55
ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問