問題タブ [bytestring]
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.
haskell - ByteStrings から Text への部分的なデコード
ByteStrings をさまざまなエンコーディングから Text にデコードする必要がありますが、ByteStrings は不完全なフラグメントである可能性があります。理想的には、次のような署名を持つ関数が必要です。
これは、正常にデコードされた Text と、完全な Unicode 文字を形成しなかった残りのバイトを返します (したがって、次のフラグメントを取得するときにそれらのバイトを再利用できます)。
この種の関数は既にいくつかの Haskell ライブラリに存在しますか?それとも自分で作成する必要がありますか? 今のところ、UTF-8 を超えるエンコーディングをサポートしていないものから始めることもできます。
haskell - Haskell Bytestring は ASCII を変更しますか?
バイト文字列から特定の文字を取得し、その ASCII を変更して元に戻すにはどうすればよいですか? readInt などを使用しますか?
例: "aaaaa" ,"a" は 97 なのでマイナス 1 で "aa`aa" となります
haskell - Haskell バイト文字列のパック/アンパック
バイト文字列がどのように機能するのかまだわかりません
バイト文字列を使用して、大量のデータを非常に迅速かつ効率的に読み取ることができることを知っています。しかし、梱包を解いても意味がありません。
アンパックせずにデータをバイト文字列形式で読み取ることはできませんか? それとも、データのセグメントを展開するだけですか?
それがどのように機能するか説明していただけますか?(コード例)
haskell - Haskell でのビットスワッピングの問題
学校のプロジェクトの一環として、Haskell でいくつかの暗号化アルゴリズムを実装しています。おそらくご存知のように、これにはかなりの低レベルのビット操作が含まれます。今、私は頭痛の原因となる特定のサブルーチンに行き詰まっています。256 ビットの順列であるルーチンは、次のように機能します。
入力: 256 ビット ブロック。
次に、入力ブロックのすべての偶数ビット (0、2、...) が、出力ブロックの最初の 128 ビットと見なされます。奇数番号のビットは、出力ブロックの最後の 128 ビットと見なされます。より具体的には、出力のi 番目のビットの式は次のように与えられます (a iは入力ブロックのi 番目のビットで、b は出力です)。
b i = a 2i
b i+2 d-1 = a 2i + 1
iが0 から 2 d-1 -1 の場合、d = 8。
おもちゃの例として、256 ビットの代わりに 16 ビット ブロックで動作するルーチンの縮小バージョンを使用したとします。次に、次のビット文字列は次のように並べ替えられます。
1010 1010 1010 1010 -> 1111 1111 0000 0000
この関数のクリーンな実装を思い付くことができませんでした。特に、私は ByteString -> ByteString 署名を試してきましたが、Word8 のような粒度で作業する必要があります。しかし、出力バイト文字列の各バイトは、他のすべてのバイトのビットの関数であり、非常に面倒な操作が必要です。
この問題に取り組む方法についてのヒントやアドバイスをいただければ幸いです。
parsing - ByteStringを適切なサイズのWordに変換するにはどうすればよいですか?
基本的には数量に相当する5バイトを読みましたが、Word64に変換したいと思います。これを行うための最良の方法は何ですか?
編集:これは内部ループで実行されるため、パフォーマンスが重要であるとも言えます。理想的には、次のようなことをしたいと思います。
または同様のもの。
haskell - Lazy ByteString を厳密な ByteString に変換する
lazyByteStringを受け取る関数があり、 strictByteStringsのリストを返す必要があります (遅延は出力のリスト型に転送する必要があります)。
さまざまな理由でこれを行いたいのですが、いくつかの字句解析関数では strict が必要であり、上記の s の出力で出力された strictが非常に小さいByteStringことを保証できます。ByteStringcsVal
それらをチャンクByteStringせずに「厳密化」するにはどうすればよいですか?
Update0
Lazy を取り、そのすべてのデータを含むByteString1 つの strict を作成したいと思います。ByteString
haskell - 64 ビット Double を ByteString に効率的に変換する
64 ビットの Double を ByteString に変換する関数を作成しました (アーキテクチャ/型の安全性は実際には問題ではありません。ここでは、Double が 64 ビットの Word であると仮定します)。以下の関数はうまく機能しますが、Double を ByteString に変換するより高速な方法があるかどうか疑問に思っています。以下のコードでは、Word64 を Word8 リストに 1 回アンパックした後、(リトル エンディアン形式にするために) リバースし、ByteString にパックしています。コードは以下のとおりです。
Mac x86 での GHCi 出力のサンプル:
コードはうまく機能しているように見えますが、IPC 経由で送信する前に、多くの Double 値を ByteString にエンコードするために使用する予定です。ですから、もしあれば、より速くするための指針をいただければ幸いです。
double を Word8 にアンパックしてから、ByteString にパックする必要があるように思えます。したがって、全体的なアルゴリズムはそのままである可能性があり、あまり改善することはできません。ただし、より効率的な unpack/pack 関数を使用すると、おそらく違いが生じるでしょう。
EDIT1: Mac(GHC 7.0.3)で別の問題を発見しました-上記のコードは、このエラーのためにGHCでコンパイルされません-これまでGHCiでテストしていました:
したがって、このバグが修正されるか、回避策が見つかるまで、FFI (cereal/data-binary-ieee754 パッケージ) に頼らなければならないようです。GHC チケット 4092に関連しているようです。これが新しいバグであるか、別のバグであるかを修正してください。今のところ、私はそれをコンパイルすることはできません:(
EDIT2 : unsafeCoerce を使用するようにコードを更新すると、コンパイルの問題が修正されます。Criterion ベンチマークを使用した以下のコード:
基準出力 (切り捨て):
さらに分析すると、ボトルネックのほとんどは unpack64 にあるようです。強制には最大 6ns かかります。unpack64 には ~195ns かかります。ここでは、word64 を word8 のリストとしてアンパックするのは非常にコストがかかります。
haskell - ByteStringをニブル単位で16進数にきれいに出力します
バイトストリングをニブルで扱い、16進数(0-F)表現をきれいに印刷する慣用的な方法は何ですか?
これは、さらなる作業で
しかし、私が本当に欲しいのは
またはさらに良い
["1"、 "7e"]を操作することはできますが、その文字列操作は数値操作を行います。数値のシフトとマスキングにドロップダウンする必要がありますか?
haskell - 合計バイト長を取得するためのO(1)関数を使用したCStringの格納可能なインスタンスの書き込み
CString(私の場合はnullで終了するC文字)の格納可能なベクトルインスタンスを作成しようとしています。格納可能なインスタンスは、CStringが(Ptr CChar)であるポインターを格納します。したがって、ベクトルの長さはCStringポインターの数です。さて、この保存可能なインスタンスを作成する理由は、FFI CStringからゼロコピーを実行し、unsafeCreateを使用してByteStringを高速ビルドするために使用されるためです(変換後、ここでは中間操作に高速ベクトルを使用します)。ByteStringの高速ビルドを行うには、保存可能なインスタンスに3つのことが必要です。
- バイト単位の全長-格納可能なインスタンスには、ベクターに追加するときに各CStringの長さを格納するためのブックキーピング割り当てと、これまでに格納されたCStringの全長が必要です。C文字列の全長が2^31を超えることはできないとしましょう。したがって、Int32 / Word32は、各CStringの長さと全長を格納するために行います。
- CStringとその長さを格納する関数-O(n)時間。この関数は、CStringをウォークし、その長さを格納します。また、全長をCStringの長さだけインクリメントします。
- 長さを合計バイトで返す関数-O(1)時間。この関数は、全長を格納するフィールドから値を取得するだけです。
カスタムの保存可能なインスタンスを作成する方法は知っていますが、この種のケースを処理する方法はわかりません。カスタム簿記を行う方法を示す簡単なコード(簡単なおもちゃの例でもかまいません)、および簿記の結果を保存/取得する関数を作成することは非常に高く評価されます。
アップデート1(説明)
私の場合、保存可能なベクトルインスタンスを使用する理由は、ボックス化されていない型を使用した高速な計算/変換(C FFIを介して受信したリアルタイムデータ)と、バイト文字列への高速変換(データをリアルタイムで送信するため)の2つです。別のプログラムへのIPC)。高速なバイト文字列変換には、unsafeCreateが優れています。ただし、割り当てる量を把握し、変換用の関数を渡す必要があります。格納可能なベクトルインスタンス(混合型-上記の質問をCString型のみに簡略化した)が与えられた場合、ベクトルの各要素をウォークしてバイト文字列に変換する高速変換関数を簡単に構築できます。次に、それをunsafeCreateに渡すだけです。ただし、割り当てるバイト数も渡す必要があります。AO(n)再帰バイト長計算関数は遅すぎるため、バイト文字列を作成するオーバーヘッドが2倍になる可能性があります。