Projelerimin bir parçası olarak, sınıflarımdan birinin başlatılmasında okudukları geniş bir 32 bit tam sayı serisinden oluşan bir ikili veri dosyası var. Benim C++ kütüphanesinde, aşağıdaki başlatıcısı ile okunduğunda:Swift'de, var olan bir ikili dosyayı bir dizide nasıl okurum?
Evaluator::Evaluator() {
m_HandNumbers.resize(32487834);
ifstream inputReader;
inputReader.open("/path/to/file/7CHands.dat", ios::binary);
int inputValue;
for (int x = 0; x < 32487834; ++x) {
inputReader.read((char *) &inputValue, sizeof (inputValue));
m_HandNumbers[x] = inputValue;
}
inputReader.close();
};
ve Swift için taşıma içinde, ben (yalnızca yaklaşık 130 MB var) bir tampon içine dosyanın tamamını okumak ve sonra bayt kopya çıkışı için karar Tamponun
Yani, şunları yaptık:
public init() {
var inputStream = NSInputStream(fileAtPath: "/path/to/file/7CHands.dat")!
var inputBuffer = [UInt8](count: 32478734 * 4, repeatedValue: 0)
inputStream.open()
inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
inputStream.close()
}
ve bunu hata ayıklama zaman ben INPUTBUFFER benim onaltılık editörü olması gerektiği diyor bayt aynı diziyi içeren görebilirsiniz ki çalışıyor. Şimdi, bu verileri oradan etkin bir şekilde almak istiyorum. En az anlamlı baytların ilk olduğu yerde (yani dosyada 0x00011D4A '4A1D 0100' olarak belirtilir) onu çağırdığınız her hangi bir formatta saklandığını biliyorum. Ben sadece elle yineleme ve bayt değerleri elle hesaplamak için cazip değilim, ama ben hızlı bir yol varsa [Int32] bir dizi geçirebilir ve bu baytlar okumak var mı merak ediyorum. NSData kullanarak çalıştı, gibi:
Ancak bu değerler yüklenmemiş gibi görünüyordu (tüm değerler hala sıfırdı). Bu bayt dizisini bazı Int32 değerlerine dönüştürmeme yardımcı olabilir misiniz? Daha da iyisi, değişken boyutlarımın proje boyunca aynı kalmasını sağlamak için onları Int (yani 64 bit tamsayı) haline dönüştürmek olacaktır.
Bu işlevi kullanmayı denedim ve sıfırdan başka bir şey elde edemiyorum. Data.getBytes ifadesinin verileri giriş arabelleğinden doğru şekilde yüklemediğini sanmıyorum. İşleviniz iyi işleyebilir, ancak şu anda hiç bir fikrim yok. Herhangi bir neden görüyor musunuz, girişBuffer non-sıfırlar içeriyor biliyorum, neden benim data.getBytes deyim çalışmıyor? – Charles
'data.getBytes (& inputBuffer ...)' * * 'den veriyi okur ve *' inputBuffer 'yerine başka bir şekilde döndürmez. Dosyayı 'NSData' içine okumanız ve doğru boyuttaki tamsayılar dizisine okumanız gerekiyor. – Grimxn
Buna dayanarak, verileri basitçe veri dosyamdaki yolla basitçe başlatmamı basitleştirdim: 'veri ver = NSData (contentOfFile:" /path/to/file/7CHands.dat ")!'Ve bu veri yükleme kadar bir çekicilik gibi çalışır gibi görünüyor, daha sonra fonksiyonunuza basit bir çağrı (ortaya çıktığı gibi, küçük-Hindistan'da) ve her şey gemi şeklindedir. Bu DOES uzun bir süre alıyor, ancak .. Sürüm salınımında bile, C + + anlık iken montaj için 90 saniye sürüyor. İki dil arasındaki fark gerçekten bu kadar önemli mi, yoksa bir yerdeki bir yapı eksik mi? – Charles