我的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
不确定这里出了什么问题,或者如何区别对待。如果有人能解释我做错了什么以及如何补救我会非常感激。
由于
答案 0 :(得分:3)
将信息从评论移至答案。
如果两个部分中没有一个具有已知的字符串长度,则无法解决此问题,因为适合32位的整数的十进制表示可以具有1到10位数的长度。例如,字符串01365185178
或45981365185466
也符合您编写的约束 - 32位数字0
或4598
,后跟时间戳。但是,我们如何确定“前4个字节”的结束位置?在第一种情况下,它是一个字符,在第二种情况下是四个字符。
如果你确实知道其中一个的长度,那么这就像切片一样简单。由于您已指出UID部分必须为零填充,因此如下所示:
NSString * UID = [step9String substringToIndex:10];
NSString * timestamp = [step9String substringFromIndex:10];
你出了什么问题,你的字符串中的信息由字符组成,每个字符占用一个字节。当您将信息放入NSData
对象时,它仍然是字符 - 没有自动转换为二进制int
。您需要一个NSScanner
对象或scanf()
或类似对象。因此,当您访问数据对象的前四个字节时,您只需获取原始字符串的前四个字符。