問題タブ [bytebuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaで1つのDouble配列と2つのLong配列をByteBufferにダンプします
1 つの Double 配列と 2 つの Long 配列を bytebuffer にダンプしたいと考えています。ループを使用して行うことができます
これは効率的ではないようです。それらをボークダンプする方法はありますか?
java - ByteBuffer getInt() の質問
C++ サーバーとのソケット通信に Java ByteBuffer を使用しています。Java はビッグエンディアンであり、ソケット通信もビッグエンディアンです。そのため、バイト ストリームが受信され、Java によって ByteBuffer に入れられるたびに、getInt() を呼び出して値を取得します。問題ありません。変換はありません。
しかし、何らかの方法で ByteBuffer のバイト順をリトルエンディアンに具体的に設定すると (私の同僚が実際にこれを行いました)、
データがByteBufferに入れられると、Javaはビッグエンディアンをリトルエンディアンに自動的に変換しますか?
次に、リトル エンディアン バージョンの getInt() は正しい値を返しますか?
上記の 2 つの質問に対する答えはイエスだと思います。しかし、推測を検証して、ByteBuffer で getInt() がどのように機能するかを調べようとすると、それが抽象メソッドであることがわかりました。ByteBuffer の唯一のサブクラスは、抽象 getInt() を実装していない MappedByteBuffer クラスです。getInt() メソッドの実装はどこにあるのでしょうか。
送信には、リトルエンディアンの ByteBuffer を使用しているため、ソケットに入れる前にビッグエンディアンのバイトに変換する必要があります。
java - 複数のスレッドが、Java で直接マップされた ByteBuffer への書き込みを確認できますか?
私は、メモリにマップされたファイル ( FileChannel.map()を介して) から構築されたByteBuffersと、メモリ内の直接 ByteBuffers を使用するものに取り組んでいます。並行性とメモリ モデルの制約を理解しようとしています。
FileChannel、ByteBuffer、MappedByteBuffer などの関連するすべての Javadoc (およびソース) を読みました。特定の ByteBuffer (および関連するサブクラス) に多数のフィールドがあり、状態がメモリ モデルから保護されていないことは明らかです。視点。そのため、特定の ByteBuffer の状態を変更するときに、そのバッファーが複数のスレッドで使用されている場合は同期する必要があります。一般的なトリックには、ThreadLocal を使用して ByteBuffer をラップする、(同期中に) 複製して同じマップされたバイトを指す新しいインスタンスを取得するなどがあります。
このシナリオを考えると:
B_all
マネージャーには、ファイル全体にマップされたバイト バッファーがあります (2 GB 未満とします)。- マネージャーは、B_all で duplicate()、position()、limit()、および slice() を呼び出して、ファイルのチャンクである新しいより小さい ByteBuffer を作成し、
B_1
これをスレッド T1 に渡します。 B_2
マネージャーは、同じマップされたバイトを指すByteBuffer を作成するためにすべて同じことを行い、これをスレッド T2 に渡します
私の質問は、T1 が B_1 に書き込み、T2 が B_2 に同時に書き込み、互いの変更を確実に確認できるかどうかです。T3 は B_all を使用してこれらのバイトを読み取り、T1 と T2 の両方からの変更を確実に確認できますか?
force() を使用して OS にページをディスクに書き込むように指示しない限り、マップされたファイルへの書き込みが必ずしもプロセス間で見られるとは限らないことを認識しています。私はそれを気にしません。この質問では、この JVM が単一のマップされたファイルを書き込む唯一のプロセスであると仮定します。
注: 私は推測を求めているわけではありません (自分で推測することはできます)。メモリ マップド ダイレクト バッファで何が保証されているか (または保証されていないか) について、決定的なものへの参照を希望します。または、実際の経験や否定的なテスト ケースがあれば、それも十分な証拠となる可能性があります。
更新:複数のスレッドが同じファイルに並行して書き込むことでいくつかのテストを行ったところ、これまでのところ、それらの書き込みは他のスレッドからすぐに見えるようです。そこまで頼れるか不安ですけどね。
java - Thrift rpc を使用したバイナリ データの転送の説明が必要
以下のThriftサービスを定義したとしましょう
ここに私が理解できない生成された実装があります
文字列のしくみ
? 同期ですか非同期ですか?大きなデータ (数メガバイト以上) ではどのように機能しますか? そして、それらのデータを読み取るために何が必要ですか? 残念ながら、私は java.nio と ByteBuffer を扱うことに慣れていません。例やガイドがあればいいでしょう。
java - オブジェクトをシリアル化せずに ByteBuffer に入れる
オブジェクトを ByteBuffer に入れようとしていますが、役に立ちません。
DirectX/XNA 頂点バッファーを模倣する Android 用の VertexBuffer クラスを作成しようとしています。つまり、任意のタイプの頂点構造 (特定のインターフェイスを実装する/特定のクラスを拡張する) を許可したいということです。これを行うには、そのオブジェクトを byte[] に変換する必要があります。
Serializable、ByteArrayOutputStream、および ObjectOutputStream を調べましたが、バイト数が多すぎます。元。x、y、z の 3 つの float を持つ Vertex クラスは、約 3 * 4 または 12 バイトになるはずですが、結果の配列の長さは 51 になります! 余分なバイトはシリアル化の結果であり、おそらく配列の最後のバイトを取ることができると確信していますが、それは遅く、より簡単な方法があれば、それを好むでしょう。
getClass メソッドの使用についても調査し、プリミティブ データに到達するまでフィールドを再帰的にループします。プリミティブ データを使用して、それぞれの put メソッドを使用して ByteBuffer に直接配置できます。これは (私の意見では) 最も堅牢な方法ですが、シリアル化を使用するよりも難しいようです。
編集: 頂点バッファー クラスは、頂点データをバイトとして ByteBuffer (またはその他の拡張子) に格納することになっています。頂点データ クラスは、頂点バッファーにバイトの使用方法を伝える「getVertexDeclaration」メソッドを継承する必要があります。例えば:
頂点バッファーに渡されると、このクラスは、位置、テクスチャ座標、および色データを持つ頂点であることをバッファーに伝えます。VertexDeclaration はクラスのフィールドを反映します。最初の 12 バイト (Vector3) は位置データとして使用されます。次の 8 バイト (Vector2) は、テクスチャ座標として使用されます。最後の 4 バイトはカラー データとして使用されます。
私の質問に戻ると、これらのバイトを頂点バッファー内のストレージ用に分離したいだけです。ByteBuffer でそれらが必要な理由は、glDrawElements が他のパラメーターと共に Buffer を渡す必要があるためです。
頂点を元の状態に復元したくないので、バイトを作成するときにシリアル化によって大量に発生する余分なものはすべて必要ありません。
float 配列と FloatBuffer を使用するだけでうまくいきますが、これを理解できれば、さまざまな種類の頂点を使用するプロセスが簡素化されます。
wpf - RenderTargetBitmap は生データをディスクに保存します
RenderTargetBitmap の高 fps ストリームがあります。それらをディスクに保存して後で処理したいのですが、それらを Png や bmp などにエンコードしたくありません。未加工のバイト バッファを保存したいのです。
それは可能ですか?
ありがとう
java - Rubyでオブジェクトのようなバイトバッファを作成する
RubyでBytebufferのようなオブジェクトを作成する必要があります。これがJAVAでの私の例です
メッセージ本文部分のサイズである4バイトで始まるメッセージを作成し、次に実際のメッセージを作成します。Rubyでこれを行う方法がわからないので、助けてください。
java - ByteBuffer とバイト配列
問題
2 つの int と可変長の文字列をバイトに変換する必要があります。
私がしたこと
各データ型をバイト配列に変換してから、バイト バッファーに追加しました。その直後に、以下に示すように、そのバッファーを 1 つのバイト配列にコピーします。
これは少し冗長に思えます。確かにすべてをバイト バッファーに配置し、それをバイト配列に変換できます。ただし、弦の長さはわかりません。この場合、バイトバッファをどのように割り当てるのでしょうか? (バイトバッファを割り当てるには、その容量を指定する必要があります)
java - ReadableByteChannel が read(bytebuffer) でハングする
私はJava 1.6を使用してインスタントメッセンジャーに取り組んでいます。IM は、マルチスレッド (メイン スレッド、受信、および ping) を使用します。TCP/IP 通信には SocketChannel を使用しました。また、サーバーから大きなパッケージを受信する際に問題があるようです。サーバーは1つではなく2つのパッケージを送信し、そこから問題が始まります。最初の 8 バイトごとに、パッケージの種類とサイズが示されます。これが私が読んだ方法です:
そして、テスト中、アカウントにログインしてバディリストをインポートするまでは、すべて問題ありませんでした。ステータスのリクエストをサーバーに送信すると、80 件の連絡先のうち約 10 件が返信されました。だから私はこのようなものを思いついた:
各 readStuff() と readDescription() は、バッファ内の残りのバイトで各パラメータのサイズをチェックしています。
および Receiver.receiver.read() は次のとおりです。
したがって、アプリケーションは起動され、ログに記録され、連絡先が送信されます。サーバーは私のリストの一部だけを私に送り返してきます。しかし、メソッドreadInStatus(ByteBuffer headBuffer)では、リストの残りを強制しようとします。そして今、楽しい部分 - しばらくすると、Receiver.receiver.read()に到達し、バイト = readChannel.read(bb)で停止し、理由がわかりません。しばらくしてもエラーはなく、何もありません。アイデアの。私はこの一週間ずっと戦っていますが、解決策に近づくことはできません。提案をいただければ幸いです。ありがとう。
返信ありがとうございます。はい、ブロッキング SocketChannel を使用しています。ノンブロッキングを試しましたが、暴走して制御不能になったため、アイデアをスキップしました。私が期待するバイトについて-これはちょっと奇妙です。なぜなら、サイズはヘッドで1回だけですが、パッケージ全体ではなく最初の部分のサイズであり、他の部分にはヘッダーバイトがまったく含まれていないからです。それが何バイトになるかは予測できません。その理由は、容量が 255 バイトの記述です。これがまさに私が変数バディを作成した理由です:これpublic synchronized void readInStatus(ByteBuffer headBuffer)
は基本的にバディリストの長さであり、各フィールドを読み取る前に、十分なバイトが残っているかどうかを確認します。そうでない場合はread()を実行します. ただし、説明の前の最後のフィールドは、着信説明の長さを持つ整数です。ただし、何らかの処理が完了するまで、パッケージの長さを判断することは不可能です。@robertその状況でノンブロッキングSocketChannelにもう一度切り替えてみるべきだと思いますか?