2010-11-25 2 views
2

Я много читал о том, как преобразовать строку в шестнадцатеричное значение. Вот что я нашел для достижения этой цели:Преобразование NSString в Hex

NSString * hexString = [NSString stringWithFormat:@"%x", midiValue]; 

Возвращаемый «интересные» результаты и после прочтения немного дальше, я нашел пост, который упоминается в этом

«можно передать указатель на объект, представляющий числовое значение, а не собственное число. "

Итак, я заменил 192 вместо «midiValue», и он сделал то, что я ожидал.

Как передать строковое значение, а не указатель?

Decleration из midiValue:

NSString *dMidiInfo = [object valueForKey:@"midiInformation"]; 
    int midiValue = dMidiInfo; 
+0

«Интересные» результаты не говорят нам, что они были. Можете ли вы указать? Можете ли вы также показать объявление «midiValue»? – zneak 2010-11-25 17:55:46

+0

Я не понимаю вопроса. Вы говорите, что хотите преобразовать строку в шестнадцатеричный, но образец кода создает строку как вывод, а не принимает строку в качестве входных данных. – JWWalker 2010-11-25 17:59:02

ответ

4

Вы, вероятно, нужно сделать что-то вроде этого:

NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init]; 
int anInt= [[numberFormatter numberFromString:string ] intValue]; 

также, я думаю, есть несколько примеров кода в документации Xcode для преобразования и от шестнадцатеричное значение в образце QTMetadataEditor. в классе MyValueFormatter.

+ (NSString *)hexStringFromData:(NSData*) dataValue{ 
    UInt32 byteLength = [dataValue length], byteCounter = 0; 
    UInt32 stringLength = (byteLength*2) + 1, stringCounter = 0; 
    unsigned char dstBuffer[stringLength]; 
    unsigned char srcBuffer[byteLength]; 
    unsigned char *srcPtr = srcBuffer; 
    [dataValue getBytes:srcBuffer]; 
    const unsigned char t[16] = "ABCDEF"; 

    for (; byteCounter < byteLength; byteCounter++){ 
     unsigned src = *srcPtr; 
     dstBuffer[stringCounter++] = t[src>>4]; 
     dstBuffer[stringCounter++] = t[src & 15]; 
     srcPtr++; 
    } 
    dstBuffer[stringCounter] = '\0'; 

    return [NSString stringWithUTF8String:(char*)dstBuffer]; 
} 

+ (NSData *)dataFromHexString:(NSString*) dataValue{ 
    UInt32 stringLength = [dataValue length]; 
    UInt32 byteLength = stringLength/2; 
    UInt32 byteCounter = 0; 
    unsigned char srcBuffer[stringLength]; 
    [dataValue getCString:(char *)srcBuffer]; 
    unsigned char *srcPtr = srcBuffer; 
    Byte dstBuffer[byteLength]; 
    Byte *dst = dstBuffer; 
    for(; byteCounter < byteLength;){ 
     unsigned char c = *srcPtr++; 
     unsigned char d = *srcPtr++; 
     unsigned hi = 0, lo = 0; 
     hi = charTo4Bits(c); 
     lo = charTo4Bits(d); 
     if (hi== 255 || lo == 255){ 
      //errorCase 
      return nil; 
     } 
     dstBuffer[byteCounter++] = ((hi << 4) | lo); 
    } 
    return [NSData dataWithBytes:dst length:byteLength]; 
} 

Надеюсь, это поможет.

2

если вы перепутали простое приложение iPhone в Xcode с помощью iPhone 5.1 Simulator, то это полезно:

//======================================================== 
// This action is executed whenever the hex button is 
// tapped by the user. 
//======================================================== 
- (IBAction)hexPressed:(UIButton *)sender 
{ 
    // Change the current base to hex. 
    self.currentBase = @"hex"; 

    // Aquire string object from text feild and store in a NSString object 
    NSString *temp = self.labelDisplay.text; 

    // Cast NSString object into an Int and the using NSString method StringWithFormat 
    // which is similar to c's printf format then output into hexidecimal then return 
    // this NSString object with the hexidecimal value back to the text field for display 
    self.labelDisplay.text=[NSString stringWithFormat:@"%x",[temp intValue]]; 

} 
Смежные вопросы