🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

4676閲覧

Java・KotlinでのByte 0xffの送り方

rashild

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/11/20 07:39

現在、KotlinでスマートフォンをホストにしたUSB端末と接続して利用するアプリを開発しています。
その中でandroid.hardware.usb以下のライブラリを利用してバイト列をUSB端末に送受信する処理があるのですが、Kotlinではbyte型が-128~128の範囲で定義されていて255の0xffなどをbyteArrayの中に書いてもエラーが起きてbyteとして認識されません。
また、デバッグがPCと接続していないとできないため,実機とUSB端末とを接続している時に起きているエラーが見れないことにも困っています。
何か解決策・回答に不十分な点がありましたらお願いします。

以下コードです。(通信系の処理なので非同期で書いているつもりです)
epOut,epInはusbEndpoint型
mUsbDeviceはusbDevice型
connectionはUsbDeviceConnection型です。

kotlin

1fun communicateDevice() = GlobalScope.launch(Dispatchers.Main) { 2 val usbInterface = mUsbDevice!!.getInterface(0) 3 for (i in 0..usbInterface.endpointCount-1){ 4 val ep = usbInterface.getEndpoint(i) 5 if(ep.type == UsbConstants.USB_ENDPOINT_XFER_INT){ 6 if(ep.direction == UsbConstants.USB_DIR_IN){ 7 epIn = ep 8 }else if(ep.type == UsbConstants.USB_DIR_OUT){ 9 epOut = ep 10 } 11 } 12 } 13 connection.claimInterface(usbInterface,true) 14 launch { 15 async(Dispatchers.Default) { 16 //0xffをそのまま書くとエラーが出るのでtoByte()変換するが-1が返される。 17 doRequest(byteArrayOf(0x00, 0x00, 0xff.toByte(), 0x00, 0xff.toByte(), 0x00)) 18 //実際はこの後送受信のコードがまだ続いています。 19 }.await() 20 } 21} 22 23@Throws(IOException::class) 24private fun doRequest(buff: ByteArray) { 25 println("request") 26 val buffer = ByteBuffer.allocate(buff.size) 27 val request = UsbRequest() 28 buffer.put(buff) 29 30 request.initialize(connection, epOut) 31 request.queue(buffer, buff.size) 32 33 var finishReq: UsbRequest? 34 do { 35 finishReq = connection.requestWait() 36 if(finishReq == request){ 37 break 38 } 39 if (finishReq == null) throw IOException("Request failed.") 40 sleep(100) 41 }while(true) 42} 43 44 45@Throws(IOException::class) 46private fun doResponse(): ByteArray { 47 println("response") 48 val buffer = ByteBuffer.allocate(epIn.getMaxPacketSize()) 49 buffer.clear() 50 val request = UsbRequest() 51 request.initialize(connection, epIn) 52 request.queue(buffer, epIn.getMaxPacketSize()) 53 var finishReq: UsbRequest? 54 do { 55 finishReq = connection.requestWait() 56 if(finishReq == request){ 57 break 58 } 59 if (finishReq == null) throw IOException("Request failed.") 60 sleep(100) 61 }while(true) 62 if (buffer.remaining() == 0) buffer.flip() 63 val buff = ByteArray(buffer.remaining()) 64 buffer.get(buff) 65 return buff 66}

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

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

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

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

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

jimbe

2019/11/20 10:42

コードの中に //0xffをそのまま書くとエラーが出るのでtoByte()変換するが-1が返される。 とありますが, 何から -1 が返されているのでしょうか.
rashild

2019/11/20 10:45

0xff.toByte()がprintlnで-1が出力されたという意味でした
jimbe

2019/11/20 10:50 編集

1 バイトは 8 ビットであり, 表される値の範囲は 0b00000000~0b11111111 すなわち 0x00~0xff であるとはご理解されていると思います. ではなぜ kotlin の byte 型は -128~127 を 1 バイトで表すことが出来るのかをお考えになったことはありますでしょうか.
rashild

2019/11/20 10:58

ありません。
jimbe

2019/11/20 11:09

では, byte 型の -1 がどのようなビットパターンになるのかをお調べになっては如何でしょうか.
guest

回答1

0

ベストアンサー

//0xffをそのまま書くとエラーが出るのでtoByte()変換するが-1が返される。

と、コメントがありますので、その状態で正しく0xffの値として扱えています。
現状我々が使用するコンピューターが扱うデータは、ビットの並びであり、コンピューターと私たちプログラミングする人間は、それを一定のまとまりでルールに基づいて解釈しなければなりません。
今回はbyteなので、byte型で 0xff という1バイトのビットの並びを解釈すると、byte型の値としては -1 となるのです。そのため、デバッグプリントや何らかの方法で中身を見た時に、byteとして評価された結果となるので、目に見えるのは -1 になってしまいます。

なぜ-1が0xffなのかについては、2の補数、を調べてみてください。
一定のビットのまとまりでの数値表現方法の一つです。コンピューターのプログラミング言語の整数は大抵の場合それで表現されます。

一応Wikipediaのリンクを貼っときますね。
2の補数

また、toByte() しないとエラーになるのは、言語仕様上0xffはint型の値だからです。型が違えば代入できないのは当然ですよね。

投稿2019/11/21 22:11

ironya

総合スコア456

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問