objective-c - 从 NSString 获取第一个 32 位(4 字节)数字

标签 objective-c cocoa-touch cocoa nsdata

我的 NSString 看起来像这样:

42949672951365185178

它是 32 位数字 4294967295 和时间戳 1365185178 的串联。

我需要将两者分开,以便我可以分别获取数字和时间戳。我只知道前 32 位是“数字”部分,其余的是时间戳。

这是我尝试过的:

NSString *step9String = @"42949672951365185178";
NSData *step10uAndTS = [step9String dataUsingEncoding:NSASCIIStringEncoding];

NSRange uidRange = NSMakeRange(0, 4); // 4 bytes
UInt8 uidBytes[uidRange.length];
[step10uAndTS getBytes:&uidBytes range:uidRange];

NSData *uidData = [NSData dataWithBytes:uidBytes length:sizeof(uidBytes)];
NSString *uid = [[NSString alloc] initWithData:uidData encoding:NSASCIIStringEncoding];

// and the rest should be the timestamp
NSRange tsRange = NSMakeRange(4, step10uAndTS.length-4);
UInt8 tsBytes[tsRange.length];
[step10uAndTS getBytes:&tsBytes range:tsRange];

NSData *tsData = [NSData dataWithBytes:tsBytes length:sizeof(tsBytes)];
NSString *ts = [[NSString alloc] initWithData:tsData encoding:NSASCIIStringEncoding];

NSLog(@"UID: %@, TS: %@", uid, ts);

但是我得到了这个输出:

UID: 4294, TS: 9672951365185466

不确定这里出了什么问题,或者如何以不同的方式做。如果有人能解释我做错了什么以及如何纠正,我将非常感激。

谢谢

最佳答案

将信息从评论移至答案。

如果两个部分之一没有已知的字符串长度,则无法解决此问题,因为适合 32 位的整数的十进制表示形式可以具有 1 到 10 位数字的长度。例如,字符串 0136518517845981365185466 也符合您所编写的约束 - 32 位数字、04598,后跟时间戳。但是,我们如何确定“前 4 个字节”的结束位置呢?在第一种情况下,它是一个字符,在第二种情况下,它是四个字符。

如果实际上您确实知道其中一个的长度,那么这就像对字符串进行切片一样简单。由于您已指示 UID 部分必须用零填充,因此如下所示:

NSString * UID = [step9String substringToIndex:10];
NSString * timestamp = [step9String substringFromIndex:10];

你的问题在于字符串中的信息是由字符组成的,每个字符占用一个字节。当您将信息放入 NSData 对象中时,它仍然是字符 - 不会自动转换为二进制 int。您需要一个 NSScanner 对象或 scanf() 或类似对象。因此,当您访问数据对象的前四个字节时,您只是获取原始字符串的前四个字符。

关于objective-c - 从 NSString 获取第一个 32 位(4 字节)数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840766/

相关文章:

ios - sizeWithFont 返回随机值

ios - 核心剧情: Y axis label alignment with bars

cocoa - CALayer 是否支持矢量艺术还是只处理预渲染的光栅艺术?

c++ - Cocoa 会限制 C/C++ openGL 应用程序的整体性能吗?

ios - UIViewController 和 NSURLConnection

cocoa-touch - AVFoundation - AVAssetExportSession - 操作在第二次导出尝试时停止

objective-c - 如何在 NSTableView 中选择一个 NSCell?

cocoa - NSApplicationMain() 中的 strlen 发生奇怪的 cocoa 崩溃

objective-c - 错误域=com.alamofire.error.serialization.response 代码=-1011 "Request failed: internal server error (500)"

ios - 如何使用 SoundCloud API 获取我所有的播放列表