問題タブ [htonl]
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.
c - htons の混乱 - リトル エンディアン/ビッグ エンディアン
ソケットを介してあるプロセスから別のプロセスに整数変数を送信し、受信側で値を出力すると、値は ntohl/htonl を使用しなくても同じです。ソケット構造を初期化する以外に、これらの関数をどこで使用する必要がありますか。リトル/ビッグエンディアンを理解しています。しかし、値が同じままであるのに、なぜポート番号と IP 番号をホスト/ネットワークのバイト順に変換する必要があるのでしょうか。整数がネットワーク経由で転送される方法を詳しく説明してください。
java - C ++サーバーのhtonからJava ntohsクライアントへの変換
サーバーがc ++を使用して開発され、クライアントがJavaを使用して開発された小さなTFTPクライアントサーバーアプリを作成しています。
htonsここでは、変換を使用して「ブロック数」の値を送信しています 。
しかし、クライアントで元の値に戻すことはできません。
たとえば
ntohs(01)、サーバーからクライアントにブロック カウント (2 バイト) を送信している場合。クライアントはバイト単位で読み取り中です。私が受け取っている値は、バイト 0 とバイト 1 です。
誰かが解決策を提供できる場合はお願いします。
c# - ntohs() と ntohl() は同等ですか?
C#にネットからホストへの変換関数はありますか? グーグルで検索してもあまり見つかりません。:P
c++ - C ++で64ビット整数用の「標準」のhtonlのような関数はありますか?
私は、ある時点で 64 ビットの整数値を使用する memcache プロトコルの実装に取り組んでいます。これらの値は、「ネットワーク バイト オーダー」で格納する必要があります。
変更を行う機能がuint64_t htonll(uint64_t value)あればいいのですが、残念ながら、存在する場合は見つかりませんでした。
だから私は1つまたは2つの質問があります:
- これを行うための移植可能な (Windows、Linux、AIX) 標準機能はありますか?
- そのような機能がない場合、どのように実装しますか?
基本的な実装を念頭に置いていますが、コンパイル時にエンディアンをチェックしてコードを移植可能にする方法がわかりません。だからあなたの助けはここで大歓迎です;)
ありがとうございました。
ブライアンのソリューションのおかげで、これが私が書いた最終的なソリューションです。
sockets - sockaddr_in6::sin6_addr バイト オーダーをネットワーク バイト オーダーに設定する方法は?
ネットワーク アプリケーションを開発し、ソケット API を使用しています。
sockaddr_in6構造体のsin6_addrバイトオーダーを設定したい。
16 ビットまたは 32 ビットの変数の場合は、簡単です: htons または htonl を使用する:
しかし、128 ビット変数の場合、バイト オーダーをネットワーク バイト オーダーに設定する方法がわかりません。
htons を 8 回 (2 * 8 = 16 バイト) 使用するか、htonl を 4 回 (4 * 4 = 16 バイト) 使用するという回答もありますが、どちらが正しいかはわかりません。
ありがとう。
c - ホストからネットワークへの二重?
倍精度浮動小数点数をネットワーク経由で送信したいと考えています。(標準 C、標準ソケット) データをネットワーク バイト オーダーとの間で変換するための htond または ntohd はありません。私は何をすべきか?頭の中にいくつかの解決策がありますが、一般的な方法を知りたいです。
(gstreamer で使用される gint64 値のように、64 ビット int を送信するための一般的な方法も知りたいです)
編集:これは私が考えた1つの解決策です。任意のサイズの整数で機能すると思いますが、倍精度では正しいですか?
c - 移植可能な C バイナリ シリアライゼーション プリミティブ
私の知る限り、C ライブラリは、数値を非テキスト バイト ストリームにシリアライズする際に何の助けにもなりません。私が間違っている場合は修正してください。
使用されている最も標準的なツールはhtonl、POSIX の et al です。これらの関数には欠点があります。
- 64 ビットのサポートはありません。
- 浮動小数点はサポートされていません。
- 署名された型のバージョンはありません。逆シリアル化する場合、符号なしから符号付きへの変換は、UB である符号付き整数オーバーフローに依存します。
- それらの名前は、データ型のサイズを示していません。
- それらは、8 ビットのバイトと正確なサイズの uint_ N _tの存在に依存します。
- バイト ストリームを参照する代わりに、入力の型は出力の型と同じです。
- これには、アラインメントが安全ではない可能性のあるポインターの型キャストを実行する必要があります。
- その型キャストを実行した後、ユーザーはネイティブ メモリ レイアウトで構造体を変換して出力しようとする可能性が高く、予期しないエラーが発生する不適切な方法です。
任意のサイズcharを 8 ビット標準バイトにシリアル化するためのインターフェイスは、実際には 8 ビット バイトを認識しない C 標準と、伝送の基本単位としてオクテットを設定する標準 (ITU?) との間に分類されます。しかし、古い基準は改訂されていません。
C11 には多くのオプション コンポーネントがあるため、既存の実装に要求を課すことなく、バイナリ シリアル化拡張機能をスレッドなどと一緒に追加できます。
そのような拡張機能は有用でしょうか?それとも非 2 の補数マシンについて心配することは無意味なのでしょうか?
python - Python と C で異なる ntohl と htonl の動作
Python で C プログラムの一部の動作を模倣しようとしています。どちらも、各レコードが長さ->データであるバイナリファイルを読み取っています。C プログラムはファイルから長さバイトを取得し、それが正か負かに関係なく、ntohl() は正しい長さを返します。ただし、Python では、長さレコードが同じ値であっても、それが負の場合、OverflowError が発生します。
長さ: 419495936
トール: 281
長さ: -2147418112
OverflowError: 負の数を unsigned long に変換できません
Cと比較して:
長さ: 419495936
トール: 281
長さ: -2147418112
トール: 384
ここで何が間違っていますか?Python で C と同じ結果を生成するにはどうすればよいですか?
コードで編集
Cコードは次のとおりです。
そして、ここにPythonがあります:
c - Cで2バイトを2バイトの文字列に短縮しますか?
2バイトのshort(通常のshort)を、そのshortでhtonを使用した後、2バイトの文字列(char *)に変換する方法。問題は、htonsメソッドがint(4バイト)を返すということです。どうすればそれを2バイトの文字列に入れることができますか?
注:元の値を取得するには、結果にntohsを使用できる必要があります。
アドバイスありがとうございます:D
c++ - ネットワーク バイト オーダーは IPv6 では無意味ですか?
32 ビット整数を使用して IPv4 アドレスを格納する場合、整数のバイト順を考慮する必要があります。
ただ、128ビット整数型はほとんどのプラットフォームに組み込まれていないため、IPv6アドレスはバイト配列に格納する必要があるため、バイトオーダーは問題ではなくなったと思います。
私は正しいですか?または、IPv6 に対応する関数 htonlXXX はありますか?