私は何年も前にUNIVAC1100シリーズメインフレーム用のTCP/IPスタックを作成しました。これは、1の補数演算を備えた36ビットのワードアドレス可能なコンピュータアーキテクチャでした。
このマシンが通信I/Oを実行すると、外界から到着した8ビットバイトが各9ビットクォーターワードの下位8ビットに入れられます。したがって、このシステムでは、ntohl()は各クォーターワードの8ビットをワードの下位32ビット(上位4ビットはゼロ)に圧縮して、算術演算を実行できるようにします。
同様に、htonl()はワードの下位32ビットを取得し、この操作を元に戻して、各8ビット量を各9ビットクォーターワードの下位8ビットに入れます。
したがって、元の質問に答えるために、このコンピュータアーキテクチャでのntohl()とhtonl()の操作は互いに非常に異なっていました。
例えば:
COMP* . COMPRESS A WORD
LSSL A0,36 . CLEAR OUT A0
LSSL A1,1 . THROW AWAY TOP BIT
LDSL A0,8 . GET 8 GOOD ONE'S
LSSL A1,1 .
LDSL A0,8 .
LSSL A1,1 .
LDSL A0,8 .
LSSL A1,1 .
LDSL A0,8 .
J 0,X9 .
.
DCOMP* . DECOMPRESS A WORD
LSSL A0,36 . CLEAR A0
LSSL A1,4 . THROW OUT NOISE
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
J 0,X9 .
COMPはntohl()と同等であり、DCOMPはhtonl()と同等です。UNIVAC 1100アセンブリコードに精通していない人のために:-)LSSLは「左シングルシフト論理」であり、いくつかの位置でレジスターです。LDSLは、指定された数のレジスタのペアである「左ダブルシフト論理」です。したがって、LDSL A0,8は連結されたA0をシフトし、A1レジスタは左に8ビット、A1の上位8ビットをA0の下位8ビットにシフトします。
このコードは1981年にUNIVAC1108用に作成されました。数年後、1100/90があり、Cコンパイラが成長したときに、BSD NET / 2 TCP / IP実装の移植を開始し、ntohl()とhtonlを実装しました。 () 似たような方法で。悲しいことに、私はその仕事を完了しませんでした。
一部のインターネットRFCで「オクテット」という用語が使用されている理由がわからない場合は、その日の一部のコンピューター(PDP-10、Univacsなど)に8ビットではない「バイト」があったためです。「オクテット」は、特に8ビットバイトとして定義されました。