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

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

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

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

Q&A

解決済

3回答

16043閲覧

C# バイト配列をintに変換したい

aglkjggg

総合スコア769

C#

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

0グッド

0クリップ

投稿2016/10/27 07:16

編集2016/10/27 07:18

前提

タイトルの通りバイト配列をintに変換したいのですがうまくいきません。

0xE0 0x98という2バイトは57496になる(※図1)はずなのですが、
C#で書いたプログラム(※リスト1)を実行すると-26400になってしまいます。

また、リトルエンディアンが関係しているのかと思い、
bytes = bytes.Reveres().ToArray()も試してみましたが期待する結果を得られませんでした。

質問

どのようにすれば正しい値に変換することが出来ますでしょうか?

参考画像等

イメージ説明
図1. Google で「0xE098を10進数」と検索した時の画像

C#

1var bytes = new byte[] { 0xe0, 0x98 }; 2var intVal = BitConverter.ToInt16(bytes, 0); 3 4Console.WriteLine(intVal);

リスト1. C#でバイト配列を整数値に変換するプログラム

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

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

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

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

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

guest

回答3

0

int (16bit) =符号付整数(16bit) は -32768~32767 の範囲になります。
57496 はこの範囲に無いためオーバーフローを起こした結果 -26400 となります。

  • 16bitのまま符号なし整数に変換する場合、BitConverter.ToUInt16() を使用下さい。
  • 32bit符号付整数に変換する場合、BitConverter.ToInt32() を使用下さい。

投稿2016/10/27 07:27

編集2016/10/27 07:35
Y.H.

総合スコア7914

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

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

aglkjggg

2016/10/27 07:50 編集

ご回答ありがとうございます。 BitConverter.ToInt32() を利用する場合は最低でも4バイトないとエラーが発生しますので今回は符号なし16bitのToUInt16を利用することにしました。 以下のコードで解決しました。 var bytes = new byte[] { 0xe0, 0x98 }; bytes = bytes.Reverse().ToArray(); var intVal = BitConverter.ToUInt16(bytes, 0); Console.WriteLine(intVal);
guest

0

ベストアンサー

こんにちは。

2つミスがあります。
1つは2バイトの符号なし整数を2バイトの符号付き整数へ変換しています。
0x98e0も0xe098の両方とも2バイトの符号付き整数で表現出来る値を越えているため、オーバーフローして値が可笑しくなります。
もう一つはご理解されている通りリトルエンディアンですので、0xe0, 0x98は0x98e0として解釈されます。
0x98e0を2バイトの符号付き整数へ変換する場合、0x98e0-0x10000となるため、-26,400となります。

投稿2016/10/27 07:23

Chironian

総合スコア23272

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

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

aglkjggg

2016/10/27 07:48

ご回答ありがとうございます。 57496はInt16の最大値である32767を超えていた点を見逃してしまっておりました。 以下のコードで解決しました。 var bytes = new byte[] { 0xe0, 0x98 }; bytes = bytes.Reverse().ToArray(); var intVal = BitConverter.ToUInt16(bytes, 0); Console.WriteLine(intVal);
guest

0

short型は–32768~32767しか表現できません。
googleのやつは unsigned shortなんでしょうね。

var bytes = new byte[] { 0x98, 0xe0 }; var intVal = BitConverter.ToUInt16(bytes, 0); Console.WriteLine(intVal); //57496

投稿2016/10/27 07:27

ishi9

総合スコア1294

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

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

aglkjggg

2016/10/27 07:50

ご回答ありがとうございます。 bytes変数内は変更不可能でしたので今回はReverseを利用する方向にしました。 以下のコードで解決しました。 var bytes = new byte[] { 0xe0, 0x98 }; bytes = bytes.Reverse().ToArray(); var intVal = BitConverter.ToUInt16(bytes, 0); Console.WriteLine(intVal);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問