質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

2783閲覧

NSDataの代入について

mio_30

総合スコア7

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/03/29 04:12

編集2016/04/01 05:30

BLEを利用したiPhoneアプリの制作を行っています。
ある書籍を参考に制作をしていたのですが、NSDataのところで行き詰まってしまいました。

キャラクタリスティックの値をセットする際、

lang

1 // 値をセット 2 let value = arc4random_uniform(2000) 3 let data = NSData(bytes: [value], length: 1) 4 List.text=List.text+"My Machine -> \(data)\n" 5 print(value,"->",data) //デバック用 6 self.characteristic.value = data; 7

と記述したところ、valueは「arc4random_uniform()」で生成された値になっているのですが、dataは16進数変換され、一番上の桁が切り捨てられて下2桁だけが残っている状態で代入されています。(例:825[10進数] → 39[16進数])
この桁を3桁で代入したいのですが、(例:825[10進数] → 339[16進数])そのような方法はあるのでしょうか。

初心者丸出しの質問で申し訳ありませんが、ご教授願います。

■追記

NSDataにした時のバイト順序はどっちですか?リトル?ビッグ?

リトルでした。(順序についてすっかり頭から抜け落ちていました……!)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2016/03/29 04:43

NSDataにした時のバイト順序はどっちですか?リトル?ビッグ?
guest

回答3

0

以下のように書きます。

Swift

1var value = arc4random_uniform(2000).littleEndian 2let data = NSData(bytes: &value, length: sizeofValue(value)) 3print(value,"->",data)

投稿2016/04/01 15:36

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/04/04 00:06

varにすると普通に&を使えるんですね。分かってみるとなるほどって感じです。
mio_30

2016/04/05 15:06

遅くなってすみません!回答ありがとうございました!
guest

0

ベストアンサー

NSData(bytes:, length:)のlengthはバイト数です。配列の要素数ではありません。

swift

1var data = NSData(bytes: &value, length: sizeofValue(value))

真面目にアドレスを取得しようとして挫折した‥のですが、Stripeさんの回答を見て&を使うように修正しました。(let → var)
ちなみに、arc4random_uniformで取得した場合はUInt32なのでサイズは4バイトです。

print("sizeofValue(value)=\(sizeofValue(value))") //sizeofValue(value)=4

###文字列にしてしまえば

色々とスッキリするのですが。

let value = arc4random_uniform(2000) let data = String(value).dataUsingEncoding(NSUTF8StringEncoding) print("\(value) -> \(data!)") let str = NSString(data: data!, encoding: NSUTF8StringEncoding) print("\(data!) -> \(str!.intValue)")

投稿2016/03/29 06:46

編集2016/04/04 00:10
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mio_30

2016/04/01 05:33

遅くなってすみません!回答ありがとうございました! お二方の回答を参考に開発を進めていきます! 今回は文字列やサイズについても教えてくださったfuzzball様をベストアンサーにさせてもらいました!
guest

0

swift

1let data = NSData.init(bytes: [value], length: 2)

Lengthが短いため上位バイトが切られてしまってます。
結果はリトルエンディアンです。なので339ではなく3903。

投稿2016/03/29 06:17

編集2016/03/29 06:19
NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mio_30

2016/04/01 05:27

遅くなってすみません!回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問