コンピュータプログラミングにおいて、ネットストリングはバイト文字列のフォーマット方法であり、宣言的な表記法を用いて文字列のサイズを示す。[ 1 ] [ 2 ]
オリジナルのネットストリング仕様では、フォーマットは10進数のバイト長、コロン、バイト列、末尾のカンマとして定義されています。[ 3 ]
ネットストリングは、後続のデータのバイト長を格納するため、区切り文字や終端文字として解釈される可能性のある値(ヌル文字など)に敏感なプログラム間で、テキストやバイトデータを明確に渡すことが容易になります。
フォーマットは、ASCII数字で記述された文字列の長さ、コロン、バイトデータ、およびカンマで構成されます。ここでいう「長さ」とは「8ビット単位の数」を意味するため、例えば文字列がUTF-8でエンコードされている場合、これは文字列に含まれる文字数と一致する場合もあれば、一致しない場合もあります。
例えば、「hello world!」というテキストは次のようにエンコードされます。
< 31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c >
つまり
12 :こんにちは世界!、
そして空の文字列は次のようになります。
< 30 3a 2c >
つまり
0 : 、
カンマを付けることで、隣接レコードとして使用されるネット文字列を人間が読みやすくなり、解析が正しいことを弱く検証できます。なお、カンマがない場合、フォーマットはBencode が文字列をエンコードする方法とほぼ同じになります。
長さは先頭のゼロなしで記述されます。ゼロで始まるネットストリングは空文字列のみです。任意のバイト文字列に対して、有効なネットストリングのエンコーディングは正確に1つ存在します。
このフォーマットは生成と解析が容易なため、様々なプログラミング言語で書かれたプログラムでも容易にサポートできます。実際には、ネットストリングはバイト列やバイト列のリストの交換を簡素化するためによく使用されます。例えば、Simple Common Gateway Interface (SCGI) やQuick Mail Queuing Protocol (QMQP) での使用例を参照してください。
Netstringsは、区切り文字付きフォーマットに任意のデータを埋め込もうとする際に発生する複雑な問題を回避します。例えば、XMLでは特定のバイト値を含めることができない場合があり、エスケープと区切り文字の複雑な組み合わせが必要になります。また、マルチパートMIMEメッセージを生成するには、データの内容と競合しない区切り文字を選択する必要があります。
ネット文字列は再帰的に格納できます。文字列のシーケンスをエンコードした結果は、単一の文字列になります。上記の「hello world!」の例を、2つのネット文字列のシーケンスとして書き換え、それを単一のネット文字列としてエンコードすると、次のようになります。
17 : 5 :こんにちは、6 :世界!、、
このようなネストされたネット文字列の解析は、ダックタイピングの一例です。なぜなら、含まれる文字列("5:hello,6:world!,")は文字列であると同時にネット文字列のシーケンスでもあるからです。その実効型は、ネット文字列仕様で要求される明示的な型宣言ではなく、アプリケーションがどのように解釈するかによって決まります。一般に、ネット文字列を期待するプログラムがその内容を解釈する方法は、次の3つがあります。
ネットストリングは格納するデータの内容に制限を設けないため、ほとんどの区切り形式にネットストリングをそのまま埋め込むと、格納する形式の区切りに干渉する可能性があることに注意してください。
ネットワークプログラミングの文脈では、受信プログラムに後続のデータのサイズを知らせることは、受信プログラムが正確に必要なメモリを割り当て、より多くのデータに対応するために再割り当てする必要性を回避し、サイズ制限を超えるデータを事前に拒否できるため、潜在的に有用です。