对于我的应用程序,我想将NSString转换为包含二进制等效项的NSMutableString。所有空间必须放在适当的位置。
我找到了一个将字符串转换为二进制的片段,但所有空格都被排除在外。它或多或少看起来像这样:
NSMutableString *str2 = [NSMutableString stringWithFormat:@""];
for(NSInteger numberCopy = str; numberCopy > 0; numberCopy >>=1) {
//Prepend "0" or "1", depending on the bit
[str2 insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
}
输入Str,输出str2。
对于包含空格的版本,我有一个数组将输入字符串除以componentsSeparatedByString: @" "
,然后将二进制转换器片段(上面)除以每个数组对象。我重新添加空格。
但是,我收到控制台错误
*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]
接下来(虽然我认为不重要):
0 CoreFoundation 0x00007fff84a08b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8c72f3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff849a58ec -[__NSArrayM objectAtIndex:] + 252
3 G-Clock 0x0000000100001ff1 -[GCAppController tick:] + 1937
4 Foundation 0x00007fff8a011d05 __NSFireDelayedPerform + 358
5 CoreFoundation 0x00007fff849c5804 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
6 CoreFoundation 0x00007fff849c531d __CFRunLoopDoTimer + 557
7 CoreFoundation 0x00007fff849aaad9 __CFRunLoopRun + 1529
8 CoreFoundation 0x00007fff849aa0e2 CFRunLoopRunSpecific + 290
9 HIToolbox 0x00007fff83bbdeb4 RunCurrentEventLoopInMode + 209
10 HIToolbox 0x00007fff83bbdb94 ReceiveNextEventCommon + 166
11 HIToolbox 0x00007fff83bbdae3 BlockUntilNextEventMatchingListInMode + 62
12 AppKit 0x00007fff88b7a533 _DPSNextEvent + 685
13 AppKit 0x00007fff88b79df2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
14 AppKit 0x00007fff88b711a3 -[NSApplication run] + 517
15 AppKit 0x00007fff88b15bd6 NSApplicationMain + 869
16 G-Clock 0x0000000100000ea2 main + 34
17 libdyld.dylib 0x00007fff864fc7e1 start + 0
18 ??? 0x0000000000000003 0x0 + 3
)
我无法弄清楚什么是错的,更不用说如何改变它了。
我的代码,输入str并输出str2:
//Convert to binary
NSMutableString *str2 = [NSMutableString stringWithFormat:@""];
int count = -1;
NSArray *array = [str componentsSeparatedByString: @" "];
NSUInteger numObjects = [array count];
//Converts each object of array into binary separately, so spaces remain intact.
while (1) {
++count;
NSString *string = array[count];
NSMutableString *mutStr = [NSMutableString stringWithFormat:@""];
for (NSInteger numberCopy = [string intValue]; numberCopy > 0; numberCopy >>=1) {
//Prepend "0" or "1", depending on the bit
[mutStr insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
}
if (numObjects != count + 1) {
//Add space if this is not last run through
[mutStr appendString: @" "];
} else break;
[str2 appendString: mutStr];
}
答案 0 :(得分:1)
您在count
递增的循环中有两个位置。
在任何情况下,mutStr
也必须附加到str2
。
但我会使用for-loop代替:
for (count = 0; count < numObjects; count++) {
NSString *string = array[count];
NSMutableString *mutStr = [NSMutableString stringWithFormat:@""];
for (NSInteger numberCopy = [string intValue]; numberCopy > 0; numberCopy >>=1) {
//Prepend "0" or "1", depending on the bit
[mutStr insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
}
[str2 appendString: mutStr];
if (numObjects != count + 1) {
//Add space if this is not last run through
[str2 appendString: @" "];
}
}
答案 1 :(得分:0)
这是一个逻辑错误。在@Martin的一部分之后,在最后一次运行中,else break
位于调用[array count]
的部分之后,并且因为在该计数索引处没有数组对象,程序就破坏了。
while (1) {
++count;
if (count == numbObjects)
break;
...
}