2014-06-24 6 views
17

मैं स्विफ्ट में htonl() का उपयोग कर पूर्णांक अंतराल सेट करने की कोशिश कर रहा हूं लेकिन संकलक htonl() विधि नहीं ढूंढ रहा है।स्विफ्ट में एचटीटीएल का उपयोग करके मैं पूर्णांक अंतहीनता कैसे सेट करूं?

मैं अपने संदर्भ के रूप में उपयोग करते हुए किया गया है: Append NSInteger to NSMutableData

यहाँ मेरी कोड है:

import Foundation 
import CFNetwork 
import CoreFoundation 

var data = NSMutableData() 
var number : UInt32 = 12 
var convertedNumber : UInt32 = htonl(number) 
data.appendBytes(&convertedNumber, length: 4) 

मैं सिर्फ एक खेल के मैदान में इस बराबर चल रही है। त्रुटि है:

Use of unresolved identifier 'htonl' 

उत्तर

7

अद्यतन: मार्टिन आर के जवाब स्विफ्ट के वर्तमान संस्करण के लिए सही जवाब है: https://stackoverflow.com/a/24653879/195691

-

आप CFSwapInt32HostToBig() CoreFoundation विधि का उपयोग करना चाहिए, के रूप में htonl है संभवतः एक सी मैक्रो के रूप में लागू किया गया है जो तेजी से काम नहीं करेगा।

हालांकि, ऐसा लगता है कि यह वर्तमान में स्विफ्ट खेल के मैदान में काम नहीं करता है। मुझे इस तथ्य के बावजूद त्रुटि Playground execution failed: error: error: Couldn't lookup symbols: __OSSwapInt32 मिल रही है कि CoreFoundation दस्तावेज़ में अब बाइट स्वैपिंग विधियों के लिए स्विफ्ट में विधि हस्ताक्षर शामिल हैं।

दिलचस्प है, यह <arpa/inet.h> के कम से कम हिस्सा तरह लग रहा है, तेजी से वापस पोर्ट दिया गया है के रूप में inet_ntoa() और inet_addr() तरह के तरीकों स्विफ्ट के लिए उपलब्ध हैं, लेकिन htonl परिवार नहीं है।

+0

बहुत बढ़िया, धन्यवाद! ऐसा लगता है कि यह काम करेगा। मैं एक ब्रिजिंग हेडर/देशी-सी में htonl() को कार्यान्वित करना समाप्त कर दिया लेकिन मैं इस पर स्विच करूंगा। – Michael

+0

दाएं। htonl/htons आदि एक मैक्रो है और इसलिए स्विफ्ट में आयात नहीं किया गया है (varargs सी funcs जैसे ioctl/fcntl एक और आम बात गायब है)। यदि आप अंतहीनता को जानते हैं तो इसे पुन: कार्यान्वित करना आसान है: func ntohs (मान: CUnsignedShort) -> CUnsignedShort { // hm, htons ओएसएक्स में एक func नहीं है और मैक्रो मैप नहीं किया गया है वापसी (मूल्य << 8) + (मान >> 8); } htons = ntohs // एक ही चीज़, swap बाइट्स :-) – hnh

+0

असल में 'CFSwapInt32HostToBig' और दोस्तों को स्विफ्ट में उपलब्ध है जो Xcode 6.1.1 के साथ आता है :) –

29

Xcode 6, बीटा 3 के रूप में, सभी पूर्णांक प्रकार एक bigEndian तरीका है जिसके पूर्णांक के बड़े endian प्रतिनिधित्व वापस आती है और बाइट क्रम में परिवर्तन यदि आवश्यक हो तो कर सकते है।उदाहरण: स्विफ्ट 3 के लिए

var data = NSMutableData() 
var number : UInt32 = 0x12345678 
var convertedNumber = number.bigEndian 
data.appendBytes(&convertedNumber, length: 4) 
print(data) 
// Output: <12345678> 

अद्यतन:

let data = NSMutableData() 
let number: UInt32 = 0x12345678 
var convertedNumber = number.bigEndian 
data.append(&convertedNumber, length: 4) 

या, नई Data मूल्य प्रकार का उपयोग:

var data = Data() 
let number: UInt32 = 0x12345678 
var convertedNumber = number.bigEndian 
withUnsafePointer(to: &convertedNumber) { 
    data.append(UnsafeRawPointer($0).assumingMemoryBound(to: UInt8.self), count: 4) 
} 
+3

यदि आप विपरीत दिशा (होस्ट करने के लिए नेटवर्क) की तलाश में हैं, तो आपके पास 'UInt32 (bigEndian: number)' है, और अन्य पूर्णांक प्रकारों के लिए समान 'inits' है। –

3

के बजाय CFSwapInt32HostToBig() का उपयोग कर के रूप में एलेक्स Pretzlav आप की सलाह दी

CFSwapInt32() 
का उपयोग करना चाहिए

ntonl() and ntohl() 

और

CFSwapInt16() 
बजाय

ntons() and ntohs() 

के बजाय

आपका कैसा दिखना चाहिए

import Foundation 
import CFNetwork 
import CoreFoundation 

var data = NSMutableData() 
var number : UInt32 = 12 
var convertedNumber : UInt32 = CFSwapInt32(number) 
data.appendBytes(&convertedNumber, length: 4) 

इसके अलावा

CFSwapInt64() 

8-बाइट पूर्णांक स्वैपिंग के लिए है।

संपादित करें 1

बेशक आप केवल थोड़ा endian पूर्णांकों के साथ प्रोसेसर पर इन कार्यों का उपयोग करना चाहिए कार्यों मैं वैसे भी बाइट्स स्वैप प्रदर्शन प्रदान की कारण।

संबंधित मुद्दे

 संबंधित मुद्दे