2

ネットワークに接続しているモーターのセットに位置座標を通信するのに問題があります。文字列を問題なく送信し、モーターからテキストを受信することはできますが、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]];
4

2 に答える 2

8

さて、あなたのコードはちょっとおかしく見えます。とにかく、ネットワーク経由で 2 進整数を送信するには、エンディアンを知る必要があります。受信側は、リトル エンディアンまたはビッグ エンディアンのいずれかの整数を想定しています。

両方のコードは次のとおりです。

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)];
于 2010-07-13T16:43:15.557 に答える
1

エンディアンの問題が発生している可能性があります。Intel CPU はリトルエンディアンです。つまり、マルチバイト値の最下位バイトが最初に格納され、最上位バイトが最後に格納されます。メモリから 8 バイトの数値を読み取り、何もせずにネットワークに置くと、バイトがその順序で送信されます。

ほとんどのネットワーク プロトコル (すべてのインターネット プロトコルを含む) はビッグ エンディアンデータを想定しているため、最上位バイトが最初にネットワークに表示され、最下位バイトが最後に表示されます。あなたのネットワークプロトコルはそれを期待していますか?

于 2010-07-13T16:42:37.570 に答える