2

私の NSString は次のようになります。

42949672951365185178

これは、32 ビットの数値4294967295とタイムスタンプを連結したもの1365185178です。

数字とタイムスタンプを別々に取得できるように、2 つを分割する必要があります。私が知っているのは、最初の 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

ここで何が間違っているのか、または別の方法で行う方法がわかりません。誰かが私が間違っていることとその修正方法を説明できれば、とても感謝しています.

ありがとう

4

1 に答える 1

3

コメントから回答に情報を移動します。

32 ビットに収まる整数の 10 進数表現は 1 ~ 10 桁の長さになる可能性があるため、既知の文字列長を持つ 2 つの部分のいずれかがなければ、この問題を解決する方法はありません。たとえば、文字列01365185178または文字列45981365185466は、書かれているとおりに制約に適合します-32ビットの数値、0または4598、その後にタイムスタンプが続きます。しかし、「最初の 4 バイト」がどこで終わるかをどのように判断すればよいのでしょうか? 最初のケースでは 1 文字で、2 番目のケースでは 4 文字です。

実際にそのうちの 1 つの長さがわかっている場合、これは文字列をスライスするのと同じくらい簡単です。UID 部分をゼロで埋める必要があることを示したので、次のようになります。

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

あなたにとって間違っているのは、文字列内の情報が文字で構成されており、それぞれが 1 バイトを占めることです。情報をオブジェクトに入れるとNSData、それはまだ文字です。バイナリへの自動変換はありませんintNSScannerそのためにはオブジェクトなどが必要scanf()です。したがって、データ オブジェクトの最初の 4 バイトにアクセスすると、元の文字列の最初の 4 文字が取得されるだけです。

于 2013-04-05T18:43:55.840 に答える