Wifi 経由でアプリにデータをストリーミングするハードウェア デバイスと接続しています。データは問題なくストリーミングされています。データには、新しいレコードが開始されたことを示す文字ヘッダー (DATA:) が含まれています。問題は、受信したデータが必ずしもヘッダー境界に収まるとは限らないため、キャプチャしたデータにヘッダーが含まれるまでデータをキャプチャする必要があることです。次に、ヘッダーの前にあるものはすべて前のレコードに入り、その後にあるものはすべて新しいレコードに入ります。私はこれを機能させていますが、以前にこれを行ったことがあり、問題を解決するための優れたコンピューターサイエンスの方法があるかどうか疑問に思いました.
これが私がすることです:
現在の読み取りの NSData を NSString に変換します
NSString をプレースホルダー文字列に追加します
ヘッダー (DATA:) のプレースホルダー文字列を確認します。ヘッダーがない場合は、次の読み取りを待ちます。
ヘッダーが存在する場合は、その前にあるものを前のレコード プレースホルダーに追加し、そのプレースホルダーを完全なレコードとして配列に渡して、さらにフィールドに解析できるようにします。
ヘッダーの後に表示されるものは何でも取得し、レコードのプレースホルダーに配置して、次の読み取りで追加できるようにします。手順 3 ~ 5 を繰り返します。
これに欠陥がある場合、またはより良い方法の提案がある場合はお知らせください。
これにはいくつかの設計パターンがあるはずですが、思いつきません。
ありがとう。
更新: ここに少しのコードがあります:
uint8_t buf[1024];
unsigned int len = 0;
len = [(NSInputStream *)stream read:buf maxLength:1024];
if(len) {
[data appendBytes:(const void *)buf length:len];
int bytesRead;
bytesRead += len;
} else {
NSLog(@"No data.");
}
有限状態マシンを実装するには、このコードをどのように変更しますか?