2013-07-17 3 views
0

외부 소스에서받은 NSData 스트림을 NSLogging하고 있는데, 어떤 이유로 그것이 40 문자 청크로 자꾸 자꾸 들어가고 40 문자가되면 새 라인으로갑니다. . 스트림을 파싱하고 특정 위치의 값을 선택하려고하므로 라인을 뛰어 넘는 큰 번거 로움이 있습니다. 아무도이 동작을 방지 할 수있는 방법을 알고 있습니까?NSData가 청크로 분할됩니다.

2013-07-17 14:44:32.638 Test App 
[4041:907] data equals <3e2c042c 31333037 31373032 34302d30 372c0100> 
2013-07-17 14:44:32.698 Test App 
[4041:907] data equals <00000000 2c020000 0000002c 03000000 00002cff> 
2013-07-17 14:44:32.758 Test App 
[4041:907] data equals <00000000 00> 

편집 : 여기 내 NSLog의 예입니다 관련 코드에 관해서는, 나는 제 3 자 BLE 라이브러리를 사용하고, 그래서 나는 그것을 많이 사용하지 않을 것입니다 생각. 이것은 기본적으로 관련 코드의 유일한 라인 : 나는 롭의 제안 탄을 준

NSData *data = [BLEdevice readReceivedBytes]; 
NSLog(@"data equals %@", data); 

하고,이 결과였다 :

2013-07-17 15:21:35.399 Test App[4060:907] data equals <3e2c012c 31333037 31373033 32312d30 372cff00> 
2013-07-17 15:21:35.401 Test App[4060:907] data length equals =20 
2013-07-17 15:21:35.458 Test App[4060:907] data equals <00000000> 
2013-07-17 15:21:35.460 Test App[4060:907] data length equals =4 

는 것이 아니라, 모두 한 줄에 다시 스트리밍한다 최대 40 자. 어쩌면 그것은 BLE 일입니다.

+3

관련 코드를 표시하면 도움이됩니다. – rmaddy

+0

NSData 무엇? 당신은 어떻게 당신의 시내를 얻습니까? 버퍼 한도를 뒀습니까? 콜백 전화는 언제입니까? – Larme

+0

@Larme 타사 BLE 장치입니다. 실제로 버퍼 제한을 두었습니다. 입력 및 출력은 각각 512입니다. – John

답변

2

작은 패킷 만 보내는 경우에는 아무 것도 할 수 없습니다. 그리고 당신 아마 일정 크기의 패킷을 반환합니다 기대해서는 안됩니다.

당신은 대신 NSMutableData 객체에서 수신 된 모든 청크를 수집해야합니다

// Init once: 
NSMutableData *collectedData = [NSMutableData data]; 

// Append received data in your read loop: 
NSData *data = [BLEdevice readReceivedBytes]; 
[collectedData appendData:data]; 

이제 collectedData에서 특정 바이트를 검색 할 수 있습니다.

+0

굉장히 감사합니다! 부수적으로, 새로운 스트림이 올 때마다 collectData가 자신을 덮어 쓰지 못하게하는 appendData 외부의 호출이 있는지를 알고 계십니까? – John

관련 문제