NSOutputStreamに64ビットint値を書き込む
-
15-09-2020 - |
質問
ネットワーク上で接続したモータのセットに位置座標を伝達するのに問題があります。私はちょうど弦を決めてモーターからテキストを受け取ることができますが、私はそれをint値に送ってもらえないようです。
NSLOGを使用して、私が送信している実際の値が正しいと判断しましたが、私は私の出力ストリームを介して送信する方法が疑いません。何か案は?
64ビットint値を送信するためのマイコード:
uint64_t rawInt = m1;
rawInt <<= 16;
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];
. 解決
ええと、あなたのコードは面白いように見えます。とにかく、ネットワーク上でバイナリ整数を送信するためには、エンディアンを知る必要があります。受信者は、ほとんどまたは大きなエンディアンの整数を期待しています。
これは両方のコードです:
uint64_t myInt = 42;
uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian
uint64_t netInt = CFSwapInt64HostToBig(myInt); // use this for big endian
[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)];
. 他のヒント
あなたはおそらくエンディアンの問題を見ています。Intel CPUはリトルエンディアンです。つまり、マルチバイト値の最下位バイトが最初に格納されていることを意味します。メモリから8バイトの数字を読み込み、何もせずにネットワークに入れることで、その順序でバイトが出て行くことがあります。
ほとんどのネットワークプロトコル(すべてのインターネットプロトコルを含む)は、 Big-Endian データを期待しているため、最も重要なバイトが最初にネットワーク上に表示され、最後に最下位バイトが表示されます。ネットワークプロトコルはそれを期待していますか?
所属していません StackOverflow