Binary Representation of NSString or NSInteger

Discussion in 'Mac Programming' started by subo, Feb 20, 2010.

  1. subo macrumors newbie

    Joined:
    Jan 11, 2010
    #1
    Hello,
    Does anyone has some code in objective-c to convert a NSString or NSInteger to Binary representation string?
    Thanks All.

    Example:

    hello -> 01101000 01100101 01101100 01101100 01101111
     
  2. Detrius macrumors 68000

    Joined:
    Sep 10, 2008
    Location:
    Asheville, NC
    #2
    For an NSString, see the function -(const char *)UTF8String.

    From here, there would be a LOT of different ways to turn a single 8-bit integer into binary.


    Brute force:

    Code:
    char * CharToBinary( const char input )
    {
    	char binary[] = "00000000"; //< bug, since this will be deallocated on return.
    
    	if ( input & 0x80 )
    		binary[0] = '1';
    
    	if ( input & 0x40 )
    		binary[1] = '1';
    
    	if ( input & 0x20 )
    		binary[2] = '1';
    
    	if ( input & 0x10 )
    		binary[3] = '1';
    
    	if ( input & 0x08 )
    		binary[4] = '1';
    
    	if ( input & 0x04 )
    		binary[5] = '1';
    
    	if ( input & 0x02 )
    		binary[6] = '1';
    
    	if ( input & 0x01 )
    		binary[7] = '1';
    
    	return binary;
    }
    
    This is probably about the worst way you can do it, since it includes a lot of branches, but it can give you an idea of where you might go with a better-implemented function--e.g. a for loop or a recursive function.
     
  3. HiRez macrumors 603

    HiRez

    Joined:
    Jan 6, 2004
    Location:
    Western US
    #3
    Here's one I wrote a while ago that prints out a string representation of a integer value (will be twice as big for a 64-bit number) with some optional box doodads drawn in.

    Code:
    -(NSString*)binaryStringRepresentation:(NSInteger)input drawBoxes:(BOOL)shouldDrawBoxes {
    	NSMutableString *s = [NSMutableString string];
    	NSInteger i = 0;
    	NSInteger mask = 0;
    	NSInteger bits;
    	
    	#if __LP64__
    		bits = 64;
    	#else
    		bits = 32;
    	#endif
    	
    	if (shouldDrawBoxes) {
    		for (i = 0; i < bits / 8; i++) {
    			[s appendString:@"+--------"];
    		}
    		[s appendString:@"+\n"];
    	}
    	
    	for (i = 0; i < bits; i++) {
    		if (i % 8 == 0) {
    			if (shouldDrawBoxes) {
    				[s appendString:@"|"];
    			} else {
    				if (i > 1) {
    					[s appendString:@" "];
    				}
    			}
    		}
    		mask = 0x1 << ((bits - 1) - i);
    		if (input & mask) {
    			[s appendString:@"1"];
    		} else {
    			[s appendString:@"0"];
    		}
    	}
    	
    	if (shouldDrawBoxes) {
    		[s appendString:@"|\n"];
    		for (i = 0; i < bits / 8; i++) {
    			[s appendString:@"+--------"];
    		}
    		[s appendString:@"+\n"];
    	}
    	
    	return s;
    }
    Which will produce a string something like this:

    Code:
    +--------+--------+--------+--------+
    |00100010|10100101|11110000|00001111|
    +--------+--------+--------+--------+
     
  4. HiRez macrumors 603

    HiRez

    Joined:
    Jan 6, 2004
    Location:
    Western US
    #4
    Hey, sorry, I didn't understand you wanted to start with a character string...my function only shows integer values, so you'd have to walk the string and convert each character to use it, oh well. That's what I get for not reading carefully.
     
  5. kainjow Moderator emeritus

    kainjow

    Joined:
    Jun 15, 2000
    #5
    Code:
    #if __LP64__
    	bits = 64;
    #else
    	bits = 32;
    #endif
    Wouldn't it be better to use sizeof(input) * 8? :)
     
  6. HiRez macrumors 603

    HiRez

    Joined:
    Jan 6, 2004
    Location:
    Western US
    #6
    Yes...yes it would. Hey, I'm lazy ;)
     
  7. subo thread starter macrumors newbie

    Joined:
    Jan 11, 2010
    #7
    Very nice function and it calculates the correct value :)
    I use NSInteger bits = sizeof(input)*8; instead of
    NSInteger bits;

    #if __LP64__
    bits = 64;
    #else
    bits = 32;
    #endif

    Thank you!
     
  8. plinden macrumors 68040

    plinden

    Joined:
    Apr 8, 2004
    #8
    You can use the same code for NSString as for NSInteger, like this:
    Code:
    - (NSString *)bits:(NSInteger)value forSize:(int)size {
        const int shift = 8*size - 1;
        const unsigned mask = 1 << shift;
        NSMutableString *result = [NSMutableString string];
        for (int i = 1; i <= shift + 1; i++ ) {
            [result appendString:(value & mask ? @"1" : @"0")];
            value <<= 1;
            if (i % 8 == 0) {
                [result appendString:@" "];
            }
        }
        return result;
    }
    
    - (NSString *)bitsForInteger:(NSInteger)value {
        return [self bits:value forSize:sizeof(NSInteger)];
    }
    
    - (NSString *)bitsForString:(NSString *)value {
        const char *cString = [value UTF8String];
        int length = strlen(cString);
        NSMutableString *result = [NSMutableString string];
        for (int i = 0; i < length; i++) {
            [result appendString:[self bits:*cString++ forSize:sizeof(char)]];
        }
        return result;
    }
    
     
  9. subo thread starter macrumors newbie

    Joined:
    Jan 11, 2010
    #9
    plinden, i fix some syntax warnings and it's working.
    Thank you!
     
  10. plinden macrumors 68040

    plinden

    Joined:
    Apr 8, 2004
    #10
    Doh, sorry about the syntax errors - I converted from a couple of C functions and didn't fix the method signatures properly. I've corrected the code and made the method names a bit more Apple-y.

    I'm not an Objective C programmer, I'm just dipping into it to learn something new.
     
  11. lloyddean macrumors 6502a

    Joined:
    May 10, 2009
    Location:
    Des Moines, WA
    #11
    Why guess when you can query the header "NSObjCRuntime" for the information needed?

    I'm to lazy to write it all out but here is the code to print an NSInteger as binary.

    Code:
        NSInteger  number  = 0xAAAA;
    
        NSUInteger  bit     = ~(NSUIntegerMax >> 1);
    
        do
        {
            printf("%c", (((NSUInteger)number & bit) ? '1' : '0'));
        } while ( bit >>= 1 );
    
     
  12. lloyddean macrumors 6502a

    Joined:
    May 10, 2009
    Location:
    Des Moines, WA
    #12
    Did it anyway.

    Code:
    #import <Cocoa/Cocoa.h>
    
    NSString* stringCreateWithNSInteger(NSInteger number)
    {
        NSMutableString*    string  = [[NSMutableString string] retain];
        NSUInteger          bit     = ~(NSUIntegerMax >> 1);
    
        do
        {
            [string appendString:(((NSUInteger)number & bit) ? @"1" : @"0")];
        } while ( bit >>= 1 );
    
        return string;
    }
    
    int main(int argc, const char* argv[])
    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    
        NSInteger   number = 0xDEADBEEF;
        NSString*   string = stringCreateWithNSInteger(number);
        NSLog(@"%X = %@", number, string);
        
        [string release];
    
        [pool release];
        
        return 0;
    }
    
     

Share This Page