問題タブ [bitconverter]

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.

0 投票する
0 に答える
269 参照

c# - デプロイ時に Azure がリトル エンディアンからビッグ エンディアンに切り替える

さて、私はこの奇妙な問題を抱えています。TcpClient と Reactive Extensions を使用してチャットサーバーに接続する workerrole を作成しました。エミュレーターで実行すると、コードが機能します。最初は Rx に問題があると思っていましたが、現在は受信したパッケージ間でバイト オーダーが変わっているようです。

少し背景情報。受信した最初の 4 バイトはヘッダー、最初の 2 バイトはパケットタイプ、最後の 2 バイトは残りの長さです。問題をデバッグするには、次のステートメントを実行します。

最初のパケットは次のようになります。

ここでは、2 番目のペアが正しいペアです ((0,34)。0 = LoginSeed で、残りは 34 です)。

2 番目のパケットは次のようになります。

ここで、最初のペアが突然正しいものになり、これが突然ビッグエンディアンであることを示す変更はありません。これは Azure のバグのようなものだと思わずにはいられません。それとも私が見落としたものなのでしょうか? エミュレーターでのこの作業に注意してください。インフラストラクチャの問題に関連していると思います。

0 投票する
1 に答える
138 参照

c# - 整数をバイト単位で効率的に格納する方法は?

整数をバイト単位で格納する効率の良い方法を探しています。

状況は次のとおりです: 2 つの整数があります。値 1 は「1857」(11 ビット) で、値 2 は「14」(4 ビット) と 2 バイト (16 ビット) です。私が探しているのは、2 つの整数を 2 バイトに格納することです。これは、最初の整数を切り取り、8 ビットを最初のバイトに入れ、残りと 2 番目の整数を 2 番目のバイトに入れることを意味します。また、それらを元に戻す必要があります。

それを行う方法または.netクラスはありますか? BitConverter クラスを見つけましたが、このクラスは 1 つの整数のみを完全なバイト配列に変換するため、探しているものではありません。

0 投票する
3 に答える
407 参照

c# - 開始インデックスが変換される型のサイズで割り切れる場合に BitConverter によって使用されるショートカットが機能するのはなぜですか?

私は最近、BitConverter がどのように機能するかを調べており、他の SO の質問を読んだことから、開始インデックスが変換される型のサイズで割り切れる場合、ポインターをキャストできる場所に「近道」を取ることを読みました。変換先の型へのポインターへのインデックスの byte を参照し、逆参照します。

例として ToInt16 のソース:

私の質問は、マシンのエンディアンに関係なくなぜこれが機能するのか、データが整列されていないときに同じメカニズムを使用しないのはなぜですか?

明確にする例:

ビッグエンディアン形式であることがわかっているバイトがいくつかbufferあり、たとえばインデックス5の配列から短い値を読み取りたいと思います。また、私のマシンはWindowsであるため、リトルエンディアンを使用していると仮定します。

バイトの順序をリトルエンディアンに切り替えることで、BitConverter を次のように使用します。

コードがショートカットを取ると仮定すると、それは私が望むことをするでしょう.提供された順序でバイトをキャストし、値を返すだけです. しかし、そのショートカット コードがなければ、バイト オーダーが再び逆になり、間違った値が返されるのではないでしょうか? または、代わりに行った場合:

インデックスが 2 で割り切れないため、間違った値が得られませんか?

別の状況:

すでにリトルエンディアン形式で抽出したいが、奇数のオフセットから始まる短いバイト配列があったとします。BitConverter.IsLittleEndian が true であり、インデックスが整列されていないため、BitConverter の呼び出しでバイトの順序が逆になり、誤った値が返されることはありませんか?

0 投票する
1 に答える
429 参照

c# - BitConverter で byte[2] 配列を int に変換できないのはなぜですか?

主な問題は、SerialPort から 10 ビットしか使用されていない 2 進数を受信するため、これを使用して完全なデータを受信することです。

バイナリを int に変換する元のアイデアは次のとおりです。

バイナリは明らかに文字列です。これは機能しますが、これで試した以前のコードの代わりに、別のソリューションが存在するかどうかを知る必要があります。

しかし、これは最初の 8 ビットしか読み取れないため、残りの 2 ビットが欠落している必要があります。ToInt16 を ToInt32 に変更した場合

プログラムは System.ArgumentException: Destination array was not long enough... で停止します。

私に何ができる?