2014-01-21 6 views
0

У меня есть массив символов, который представляет GUID как байты (а не как символы), но мне нужно отменить половину массива. Это произошло потому, что я использовал sscanf, чтобы преобразовать GUID строку в массив символов (который представляет собой байт) с помощью:Как изменить массив символов

sscanf(strguid,"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
          ,&arr[0],&arr[1], 
          ,&arr[2],&arr[3],....,&arr[15]); 

Массив у меня есть, например:

2EC5D8AA85E74B5E872462155EAA9D51 

и я должен обратить его так что это даст правильный идентификатор GUID:

AAD8C52EE7855E4B872462155EAA9D51 

то, что я пробовал следующее:

unsigned int temp; 
memcpy(&temp,&arr[0],sizeof(char)); 
memcpy(&arr[0],&arr[3],sizeof(char)); 
memcpy(,&arr[3],&temp,sizeof(char)); 

И так далее. (Второй с третьим, пятый с шестой и седьмой с восьмым)

Есть ли более простой способ сделать это?

+0

Вам нужно токенизировать и отменить каждый токен, а не весь массив. – user1095108

+0

Можете ли вы, как вы сохранили массив, который нужно обратить вспять? Между ними есть «-»? – legends2k

+0

у него нет. Ты прав. Я просто хотел объяснить обратный порядок. Это произошло потому, что я использовал sscanf для преобразования if from string в char array, используя «% 02x% 02X ...-% 02x% 02x-% 02x% 02x-% 02x% 02x ...» – user1016179

ответ

0

Если я вас понимаю проблему правильно вам нужно изменить порядок следования байтов 3 первых членов GUID структуры

typedef struct { 
    unsigned long Data1; 
    unsigned short Data2; 
    unsigned short Data3; 
    byte   Data4[ 8 ]; 
} GUID; 

Вы можете попробовать это

std::reverse(guid_, guid_ + 4); 
std::reverse(guid_ + 4, guid_ + 6); 
std::reverse(guid_ + 6, guid_ + 8); 

Но я бы предпочел меняющийся sscanf формат, как это

const char *string_ = "AAD8C52E-E785-5E4B-8724-62155EAA9D51"; 

GUID guid_; 

sscanf(string_, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
    &guid_.Data1, &guid_.Data2, &guid_.Data3, 
    &guid_.Data4[0], &guid_.Data4[1], &guid_.Data4[2], &guid_.Data4[3], &guid_.Data4[4], &guid_.Data4[5], &guid_.Data4[6], &guid_.Data4[7]); 

Учтите, что вам необходимо проверить строку ввода длина, чтобы избежать более короткого разбора строки

+0

Я пробовал это, но это не так Я работаю для меня, потому что мне нужно, чтобы он был в массиве символов как байты (для функции это требуется). Но обратная функция была хороша для замены нескольких memcpy, которые я использовал. Благодарю. – user1016179

+0

Добро пожаловать. Если вы в Windows рассмотрите возможность использования '_byteswap_ushort' и' _byteswap_ulong' вместо 'std :: reverse' Они могут быть быстрее – sliser

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