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

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

新規登録して質問してみよう
ただいま回答率
85.35%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Kotlin

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

Q&A

解決済

3回答

3042閲覧

Kotlinで数値をバイナリファイルに記述したい

HYDESA

総合スコア8

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Kotlin

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

0グッド

0クリップ

投稿2021/09/09 08:34

前提・実現したいこと

お世話になります。
Kotlinでバイナリーファイルを生成しようと勉強していますが
どうしても思った通りのバイナリ値になりません。
やりたいのは、バイナリファイルに4バイトで 10 00 00 00
記述したいです。

発生している問題

kotlin

1val byte = 0x10000000 2val file = filesDir.path + "/test.dat" 3val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) 4 5bufferedOutputStream.write(byte) 6bufferedOutputStream.flush() 7bufferedOutputStream.close() 8// 結果: 00

kotlin

1val byte = 0x10000000 2val file = filesDir.path + "/test.dat" 3val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) 4 5bufferedOutputStream.write("%x".format(byte).toByteArray()) 6bufferedOutputStream.flush() 7bufferedOutputStream.close() 8// 結果: 31 30 30 30 30 30 30 30 (10進側: 100000000)

試したこと

kotlin

1val byte = ByteArray(4) 2byte[0] = 0x10 3byte[1] = 0 4byte[2] = 0 5byte[3] = 0 6val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) 7 8bufferedOutputStream.write(byte) 9bufferedOutputStream.flush() 10bufferedOutputStream.close() 11// 結果: 10 00 00 00

これ以外にもいろいろと記述したいのですが、これだとかなりの手間です。
スリムな記述方法はありませんでしょうか。

いろいろとググりましたが、これといったものが見つからなく、
ByteArrayOf()toHexString()は使えないようで困っています。
(Android Studi0 に記述すると赤くエラーになる。importは自動生成)

どなたかご教示ください。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

早速やってみましたが、うまく書き込みが出来ません。

Kotlinで数値をバイナリファイルに記述したい

無事解決したようですが、ファイルに、ということなので、ByteChannelを使った例も挙げておきます。

kotlin

1import java.nio.ByteBuffer 2import java.nio.ByteOrder 3import java.nio.file.Files 4import java.nio.file.Paths 5import java.nio.file.StandardOpenOption 6 7object Hoge { 8 @JvmStatic 9 fun main(args: Array<String>) { 10 val path = Paths.get("./xx.dat") 11 Files.deleteIfExists(path) 12 13 // 14 Files.newByteChannel( 15 path, 16 StandardOpenOption.CREATE, 17 StandardOpenOption.WRITE 18 ).use { channel -> 19 val buffer = ByteBuffer.allocate(4).apply { 20 putInt(0x12345678) 21 22 rewind() 23 println("write intValue: 0x${"%08x".format(this.getInt())} // order:${this.order()}") 24 25 rewind() 26 } 27 channel.write(buffer) 28 } 29 30 println("path=${path} size=${Files.size(path)}") 31 32 // 33 Files.newByteChannel( 34 path, 35 StandardOpenOption.READ 36 ).use { channel -> 37 val buffer = ByteBuffer.allocate(4) 38 channel.read(buffer) 39 buffer.rewind() 40 println("read intValue(1): 0x${"%08x".format(buffer.getInt())} // order:${buffer.order()}") 41 42 buffer.order(ByteOrder.LITTLE_ENDIAN) 43 buffer.rewind() 44 println("read intValue(2): 0x${"%08x".format(buffer.getInt())} // order:${buffer.order()}") 45 } 46 } 47}
//write intValue: 0x12345678 // order:BIG_ENDIAN //path=./xx.dat size=4 //read intValue(1): 0x12345678 // order:BIG_ENDIAN //read intValue(2): 0x78563412 // order:LITTLE_ENDIAN

投稿2021/09/10 13:44

shiketa

総合スコア4061

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

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

0

自己解決

shrを使って処理したところ、うまく書き込みが出来ましたので
関数を作って対処したいと思います。
ありがとうございました。

投稿2021/09/10 02:07

HYDESA

総合スコア8

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

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

0

ByteBufferを使ってみては?

おおきいエンディアン、ちいさいエンディアンを指定して、putInt()/getInt()などでいけるのではないかと。

投稿2021/09/09 08:40

shiketa

総合スコア4061

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

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

HYDESA

2021/09/10 02:04 編集

早速やってみましたが、うまく書き込みが出来ません。 val data = 0x10000000 val bb = ByteBuffer.allocate(32) bb.order(ByteOrder.BIG_ENDIAN) .put(data.toByte()) .rewind() bufferedOutputStream.write(bb.getInt()) // 結果 00 1桁目、2桁目などで抽出してそれぞれをPutしてみましたが、 結果は 10 のみと、うまくいきませんでした。 また、それ以外の方法も検討しましたが、 write文の制約がIntかByteArrayのみなので、 うまくいきません。 幸い、shrを使ってやるとうまくいきましたので、それで対処してみます。 ご教示ありがとうございました。
HYDESA

2021/09/13 00:36

shiketaさん、ご教示ありがとうございました。 ご返事が遅くなりまして、申し訳ありません。 仰せの通り、上記ソースに bufferedOutputStream.write(bb.array()) に変更して実行してみましたが、00 が32個書き込まれて終了しました。 なかなかに難しいです。
shiketa

2021/09/13 00:50

> 変更して実行してみましたが、00 が32個書き込まれて終了しました。 だって、そら、あなた。32バイトのByteBufferにしてますもの。 val bb = ByteBuffer.allocate(32) Int一個分でよければ、 val bb = ByteBuffer.allocate(Int.SIZE_BYTES) とか。
HYDESA

2021/09/23 02:42

shiketaさん、ご教示ありがとうございます。 また返信が遅くなりまして、申し訳ありません。 どこかで 10 が確認出来れば御の字だったですが、 全て00だったので、うまく理解ができませんでした。 また落ち着きましたら、再チャレンジしたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問