gpt4 book ai didi

ios - 快速将 UnsafeMutableRawPointer 转换为 String(utf8)

转载 作者:搜寻专家 更新时间:2023-11-01 06:52:23 26 4
gpt4 key购买 nike

问题很简单How to convert UnsafeMutableRawPointer? to String(encoding: utf8) in swift.

我从用 obj c 编写的套接字中获取一些数据,模型类看起来像

@interface PTData : NSObject
@property (readonly) dispatch_data_t dispatchData;
@property (readonly) void *data;
@property (readonly) size_t length;
@end

数据转String对应的obj c代码

PTExampleTextFrame *textFrame = (PTExampleTextFrame*)payload.data;
textFrame->length = ntohl(textFrame->length);
NSString *message = [[NSString alloc] initWithBytes:textFrame->utf8text length:textFrame->length encoding:NSUTF8StringEncoding];

这里 PTExampleTextFrame 是一个 struct

typedef struct _PTExampleTextFrame {
uint32_t length;
uint8_t utf8text[0];
} PTExampleTextFrame;

但我无法将代码转换为 swift。但是当我尝试转换代码时,

let data = Data(bytesNoCopy: payload!.data, count: payload.length,deallocator: .none)

let text = String(bytes: data, encoding: String.Encoding.utf8)

我以某种方式得到了答案,但文本以一些转义字符为前缀。

hi makes \0\0\0\u{02}jj

long text to \0\0L\u{1D}long text

我不明白 UnsafeMutableRawPointer 的概念以及前缀是什么。

最佳答案

如果您的将数据转换为字符串的 obj c 代码被确认可以正常工作,我建议您编写一个 Objective-C 扩展以使用 Swift。

如:

PTData+Swift.h

#import <Foundation/Foundation.h>

@class PTData;

NS_ASSUME_NONNULL_BEGIN

@interface PTData (Swift)
@property (readonly) NSString *message;

@end

NS_ASSUME_NONNULL_END

PTData+Swift.m

#import "PTData.h"
#import "PTData+Swift.h"

@implementation PTData (Swift)

- (NSString *)message {
PTExampleTextFrame *textFrame = (PTExampleTextFrame*)self.data;
uint32_t length = ntohl(textFrame->length);
NSString *message = [[NSString alloc] initWithBytes:textFrame->utf8text
length:length
encoding:NSUTF8StringEncoding];
return message;
}

@end

{YourProject}-Bridging-Header.h

#import "PTData.h"
#import "PTData+Swift.h"

(您可能需要修改 #import "PTData.h" 以包含实际的 header 。)

有了上面的扩展,你可以简单地用 Swift 编写:

debugPrint(payload.message)

否则,如果您胆敢坚持编写与您的obj c 代码等效的 Swift 代码以将数据转换为字符串,那么您显示的 Swift 代码有点太短了。

extension PTData {
var textFrameMessage: String {
let textFrame = self.data.assumingMemoryBound(to: PTExampleTextFrame.self)
let length = Int(textFrame.pointee.length.bigEndian)
let utf8text = self.data
.advanced(by: MemoryLayout<UInt32>.size) // <- Sadly enough, `MemoryLayout.offset(of:)` does not work as expected for `utf8text`
.assumingMemoryBound(to: UInt8.self)
let bytes = UnsafeBufferPointer(start: utf8text, count: length)
let message = String(bytes: bytes, encoding: .utf8)! // <- This may crash, if the message is not encoded in UTF-8
return message
}
}

debugPrint(payload.textFrameMessage)

我已经用最少的估计数据测试了上面的代码,但它可能与您收到的实际数据不同。如果您发现问题,请尝试告诉我。

关于ios - 快速将 UnsafeMutableRawPointer 转换为 String(utf8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56287718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com