2017-09-30 16 views
1

기본적으로 크로스 플랫폼 응용 프로그램에는 nativescript가 사용됩니다. 이 응용 프로그램은 BLE 장치와 상호 작용합니다. BLE 장치는 iOS 측에서 NSData 개체로 검색 할 수있는 보급 패킷 다음에 검색 응답을 보냅니다.리틀 엔디안 바이트 순서 (iOS, BLE 스캔 응답)

설명 속성의 (의사) 출력은 다음과 같습니다. < 54fca267 0b00>.

출력은 주변 장치의 하드웨어 주소를 나타냅니다.

하드웨어 담당자가 이것이 리틀 엔디안이라고 말하면서 48 비트 문자열이라는 것을 알고 있습니다. 그것은 C로 쓰여진 펌웨어를 가지고있는 주변기기에서 나옵니다.

나는 하드웨어 주소를 우리 뒤에 저장할 수 있도록 문자열을 (올바른 엔디안과 함께) 변환하려고 며칠 썼습니다. 끝이지만 우아한 해결책을 제시 할 수는 없습니다.

하나의 해결책은 NSData 개체의 description 속성을 읽은 다음 수동으로 (자바 스크립트에서) '디코딩'하는 것입니다. 이 솔루션이 프로덕션 환경에 충분히 적합하다고 생각하지 않고 대신 네이티브 유틸리티를 사용하려고합니다. 내가 사용 시도

: 문서의 THIS 페이지에서 모든 인코딩 유형 ..with

NSString.alloc().initWithDataEncoding(mac, NSUTF8StringEncoding); 

. 나는 답례로 무언가 또는 부정확 한 특성을 얻고있다.

앞서 말했듯이 이것은 NativeScript로 작성되었습니다. 그러나 나는 객관적인 C에 대해 잘 알고 있기 때문에 그 언어로 제공되는 예제를 변환 할 수 있어야합니다.

모든 입력 사항을 매우 높이 평가할 것입니다. 미리 감사드립니다!

답변

2

CRD의 대답은 올바른 궤도에 있지만 내가 추측하고있어 당신을 요구하고 무엇을하지 않습니다. "54 : fc : a2 : 67 : 0b : 00"(블루투스/MAC 주소)과 같은 결과를 원하십니까? 다음은 간단하고 무차별 한 접근법입니다 (루프 등으로 수행 할 수 있지만 IMO에는 가치가 없습니다).

// Just for testing; you already have data. 
uint8_t address[6] = { 0x54, 0xfc, 0xa2, 0x67, 0x0b, 0x00 }; 
NSData *data = [NSData dataWithBytes:address length:6]; 

// Check the length before proceeding (maybe return an error rather than crash :D) 
assert([data length] == 6); 

// Grab the bytes 
const uint8_t *bytes = data.bytes; 

// Format them 
NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", 
          bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]]; 

// 3. Profit 
NSLog(@"%@", addressString); 

그러나 ....

나는 엔지니어가 여기에 의해 무엇을 의미하는지 확실히 확실하지 않다 "작은 엔디안." 54:fc:a2는 제조업 자에 할당 된 코드가 아닙니다. 일반적으로 "리틀 엔디안"은 16 비트 워드 (CSR 플랫폼에서 실행 한 바이트)를 바이트 스왑 한 것으로 가정하므로이 코드는 fc:54:67이어야하지만 할당되지 않았습니다.전체를 으로 완전히으로 처리하면 블루투스 카메라를 만드는 TopView에 할당 된 00:0b:67을 얻을 수 있습니다. 따라서 "리틀 엔디안"이 여기에 의미하는 바를 내기하고 있습니다 (MAC 주소를 작성하는 일반적인 방법 와이어에서 정확히 그 뒤로, 그리고 "빅 엔디 언"입니다).

은 그래서에 코드를 변경합니다 :

NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", 
          bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]]; 

가 주소 00 : B0 : 67 : A2 : FC : 54?

+0

올바른 주소입니다. 사과드립니다. OUI는 si-labs에 등록해야합니다. – AzraelPwnz

+0

롭, 당신은이 질문에서 찾아보세요 수 : https://stackoverflow.com/questions/46518084/nativescript-get-string-from-interop-reference 내가 OBJ-C에서 작업하는 경우, 솔루션 것 황금 이었어! 즉, NativeScript (가능한) 제한으로 인해 stringWithFormat 메서드를 구현할 수 없습니다. – AzraelPwnz

0

6 바이트를 포함하는 NSData 개체가있는 것처럼 보입니다. 첫 번째 바이트는 최하위 바이트 (리틀 엔디안)입니다. 문자 표현을 사용하지 마십시오. 이진 데이터이므로 처리하십시오.

는 첫 번째 바이트에 대한 포인터를 얻을하고 Byte * 변수, 말, bPtr에 저장 NSDatabytes 속성을 사용합니다. 이제 바이트를 순서대로 인덱싱하고 순서대로 64 비트 부호없는 정수 변수에 삽입합니다. 정수를 비트 시프트하고 다음 바이트에서 oring하는 것으로 수행 할 수 있습니다. bPtr[5]에서 bPtr[0]으로 시작하고 매번 8을 왼쪽으로 시프트합니다.

HTH