2017-09-30 25 views
1

基本的に言えば、クロスプラットフォームアプリケーションにはnativescriptを使用しています。このアプリケーションはBLEデバイスと対話します。 BLEデバイスは、広告パケットの後にスキャン応答を送信します。これは、iOS側でNSDataオブジェクトとして取得できます。リトルエンディアンバイトオーダー(iOS、BLEスキャンレスポンス)

descriptionプロパティの出力(疑似)は、< 54fca267 0b00>です。

出力は、周辺機器のハードウェアアドレスを表します。

ハードウェアの人は、これはリトルエンディアンであると私に伝えています。私はそれが48ビットの文字列であることを知っています。それは周辺機器から来ており、そのファームウェアはC言語で書かれています。

これを文字列(正しいエンディアン)に変換しようとしています。 - しかし、エレガントなソリューションを考え出すことができません。

私が思いついた解決策は、NSDataオブジェクトの:descriptionプロパティを読み取ってから、手動で(javascriptで)それを 'デコード'することでした。私は、このソリューションが実稼働環境に十分適しているとは思わないし、代わりにネイティブユーティリティを使用したいと考えています。私が使って試してみました

:ドキュメントのTHISページから、すべてのエンコードの種類..with

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

。私は何も返さない、または間違った文字を取得しています。

これまで説明したように、これはNativeScriptで書かれています。しかし、私は客観的なCについてよく理解しているので、その言語で提供されているすべての例を変換できるはずです。

すべての入力をいただければ幸いです。前もって感謝します!

答えて

2

CRDの答えは正しい軌道に乗っているが、私は推測している、あなたが求めているものではありません。あなたは "54:fc:a2:67:0b:00"(Bluetooth/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である必要がありますが、割り当てられていません。全部をとして扱うと、となり、Bluetoothカメラを作るTopViewに割り当てられた00:0b:67が得られます。そのため、「リトルエンディアン」とは何かを賭けています(これは理にかなっています。ワイヤ上では、それはちょうどその後方にあり、「ビッグエンディアン」です)。

だからにコードを変更します:B0:67:A2:FC:54

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

はアドレス00ですか?

+0

これは正しい住所です、私の申し訳ありません。 OUIはsi-labsに登録する必要があります。 – AzraelPwnz

+0

Rob、この質問をご覧ください: https://stackoverflow.com/questions/46518084/nativescript-get-string-from-interop-reference 私がobj-cで作業していた場合、あなたのソリューションは黄金かった!つまり、NativeScript(可能な)制限のためにstringWithFormatメソッドを実装することができません。 – AzraelPwnz

0

6バイトを含むNSDataオブジェクトがあるようですが、最初のバイトは最下位バイト(リトルエンディアン)です。文字表現を使用しようとしないでください。これはバイナリデータであり、そのまま処理します。

は、たとえば、最初のバイトへのポインタを取得し、Byte *変数に保存しbPtrNSDatabytesプロパティを使用します。今度は順にバイトをインデックスし、64ビットの符号なし整数変数に順番に挿入します。これを行うには、整数をビットシフトして次のバイトにor'ingします。bPtr[5]からbPtr[0]に下がり、毎回整数を8ずつシフトします。

HTH

関連する問題