C # Big-endian ulong из 4 байтов

Поскольку AssetsLibrary устарел, используйте вместо этого Photos framework (iOS 8 и более поздние версии).

// Deprecated!
import AssetsLibrary

// Swift 3.0
let assetsLibrary = ALAssetsLibrary()
assetsLibrary.addAssetsGroupAlbum(withName: "NewAlbum", resultBlock: { assetsGroup in
    print(assetsGroup == nil ? "Already created" : "Success")
}, failureBlock: { error in
    print(error)
})

Вы можете использовать общий объект PHPhotoLibrary для создания новых фотографий, но вы не можете дать им конкретные имена, потому что вы будете работать с активами, которыми необходимо управлять с помощью Photos.app . У каждого актива есть определенные свойства.

Чтобы создать собственный альбом, используйте PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:) .

g6] Краткое описание:

// Swift 3.0
func createPhotoLibraryAlbum(name: String) {
    var albumPlaceholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
        // Request creating an album with parameter name
        let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: name)
        // Get a placeholder for the new album
        albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
    }, completionHandler: { success, error in
        if success {
            guard let placeholder = albumPlaceholder else {
                fatalError("Album placeholder is nil")
            }

            let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
            guard let album: PHAssetCollection = fetchResult.firstObject else {
                // FetchResult has no PHAssetCollection
                return
            }

            // Saved successfully!
            print(album.assetCollectionType)
        }
        else if let e = error {
            // Save album failed with error
        }
        else {
            // Save album failed with no error
        }
    })
}

Не забудьте библиотеку import Photos.

Чтобы создать новый фотоактивный ресурс на этом альбоме, используйте PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:) .

// Swift 3.0
func createPhotoOnAlbum(photo: UIImage, album: PHAssetCollection) {
    PHPhotoLibrary.shared().performChanges({
        // Request creating an asset from the image
        let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: photo)
        // Request editing the album
        guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album) else {
            // Album change request has failed
            return
        }
        // Get a placeholder for the new asset and add it to the album editing request
        guard let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else {
            // Photo Placeholder is nil
            return
        }
        albumChangeRequest.addAssets([photoPlaceholder] as NSArray)
    }, completionHandler: { success, error in
        if success {
            // Saved successfully!
        }
        else if let e = error {
            // Save photo failed with error
        }
        else {
            // Save photo failed with no error
        }
    })
}

UPDATE:

Нам нужно запросить доступ, чтобы иметь возможность использовать библиотеку Photos:

PHPhotoLibrary.requestAuthorization { status in
     switch status {
     ...
}

Начиная с iOS 10 и выше нам также нужно добавить запись для доступа в целевой файл .plist для «Конфиденциальность - описание использования библиотеки фотографий»:

NSPhotoLibraryUsageDescription
Access to photos is needed to provide app features

13
задан Community 26 February 2013 в 13:42
поделиться

3 ответа

Я полагаю, что EndianBitConverter в библиотеке MiscUtil от Jon Skeet (nuget link) может сделать то, что вы хотите.

Вы также можете поменять биты местами, используя операции сдвига битов:

uint swapEndianness(uint x)
{
    return ((x & 0x000000ff) << 24) +  // First byte
           ((x & 0x0000ff00) << 8) +   // Second byte
           ((x & 0x00ff0000) >> 8) +   // Third byte
           ((x & 0xff000000) >> 24);   // Fourth byte
}

Использование:

atomSize = BitConverter.ToUInt32(buffer, 0);
atomSize = swapEndianness(atomSize);
19
ответ дан 1 December 2019 в 19:01
поделиться

System.Net.IPAddress.NetworkToHostOrder(atomSize); перевернет ваши байты.

7
ответ дан 1 December 2019 в 19:01
поделиться

Я рекомендую использовать Mono's DataConvert который похож на BitConverter на стероидах. Он позволяет напрямую читать байтовые массивы с большой эндианой и значительно улучшает BitConverter.

Прямая ссылка на источник находится здесь.

5
ответ дан 1 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: