2014-11-27 3 views
0

Пользователь вводит значение от 0 до 5000 в текстовое поле. Мне нужно заменить байты 4 и 5 в dataToSend с шестнадцатеричным значением в текстовом поле. Например, если пользователь вводит 250, я переводю это в 00FA. В dataToSend замените 0x03 0x00 и 0xEB на 0xFA. str и str2, поэтому я могу видеть данные. Между ними есть разница, и я не знаю, что правильно.Замена байтов в NSData шестнадцатеричными значениями

- (IBAction)handleConfig1DelayMoveChange:(id)sender 
    { 
    NSString *tmp; 
    int value; 
    tmp = [txtDelayBeforeMove1 stringValue]; 
    NSString *hex = [NSString stringWithFormat:@"0x%04lX",(unsigned long)[tmp integerValue]]; 
    NSString *hex1 = [NSString stringWithFormat:@"%04lX",(unsigned long)[tmp integerValue]]; 
    dataToSend = [NSMutableData dataWithBytes:&((char[6]){0x51,0x04,0x02,0x03,0xEB,0x0D}) length:6]; 
    NSString *str = [[NSString alloc] initWithData:dataToSend encoding:NSASCIIStringEncoding]; 
    NSString *str2 = [NSString stringWithFormat:@"%.*s", [dataToSend length], [dataToSend bytes]]; 
    tmp = @""; 
    tmp = [hex1 substringWithRange:NSMakeRange(1,2)]; 
    value = [tmp intValue]; 
    [dataToSend replaceBytesInRange: NSMakeRange(3,1) withBytes: &value]; 
    str2 = [NSString stringWithFormat:@"%.*s", [dataToSend length], [dataToSend bytes]]; 
} 

ответ

0

Это работает. Комментарии и предложения по улучшению приветствуются. displayhexStr использовался для проверки изменений во время отладки.

- (IBAction)handleConfig1DelayMoveChange:(id)sender 
    { 
    NSString *tmp; 
    int i; 
    if([txtDelayBeforeMove1 intValue] < 0 || [txtDelayBeforeMove1 intValue] > 5000) 
    { 
     [self showAlert:@"Value must be between 0 and 5000"]; 
     return; 
    } 
    tmp = [txtDelayBeforeMove1 stringValue]; 
    NSString *hex1 = [NSString stringWithFormat:@"%04lX",(unsigned long)[tmp integerValue]]; 
    dataToSend = [NSMutableData dataWithBytes:&((char[6]){0x51,0x04,0x02,0x03,0xEB,0x0D}) length:6]; 
    NSMutableString *displayhexStr = 
    [NSMutableString stringWithCapacity:[dataToSend length]*2]; 
    for (i = 0; i < [dataToSend length]; i++) { 
     [displayhexStr appendFormat:@"%02x ", dbytes[i]]; 
    } 
    tmp = [hex1 substringWithRange:NSMakeRange(0,2)]; 
    NSScanner* scanner = [NSScanner scannerWithString:tmp]; 
    unsigned int intValue; 
    [scanner scanHexInt:&intValue]; 
    unsigned char uc = (unsigned char) intValue; 
    [dataToSend replaceBytesInRange: NSMakeRange(3,1) withBytes: &uc]; 
    displayhexStr = [NSMutableString stringWithCapacity:[dataToSend length]*2]; 
    for (i = 0; i < [dataToSend length]; i++) 
    { 
     [displayhexStr appendFormat:@"%02X ", dbytes[i]]; 
    } 
    tmp = [hex1 substringWithRange:NSMakeRange(2,2)]; 
    scanner = [NSScanner scannerWithString:tmp]; 
    [scanner scanHexInt:&intValue]; 
    uc = (unsigned char) intValue; 
    [dataToSend replaceBytesInRange: NSMakeRange(4,1) withBytes: &uc]; 
    displayhexStr = [NSMutableString stringWithCapacity:[dataToSend length]*2]; 
    for (i = 0; i < [dataToSend length]; i++) 
    { 
     [displayhexStr appendFormat:@"%02X ", dbytes[i]]; 
    } 
    [self send]; 
} 
Смежные вопросы