Как объединить шестнадцатеричные данные в массиве в C - PullRequest
0 голосов
/ 24 июня 2018

У меня есть поле данных следующим образом DATA = 0x02 0x01 0x02 0x03 0x04 0x05 0x06 0x07 Теперь я хочу объединить эти данные следующим образом DATA = 0x01020304050607. Как я могу сделать это с помощью программы C. Я нашел программу на C для объединения данных в массиве, и программа выглядит следующим образом:

#include<stdio.h>

int main(void)
{
    int num[3]={1, 2, 3}, n1, n2, new_num;
    n1 = num[0] * 100;
    n2 = num[1] * 10;
    new_num = n1 + n2 + num[2];
    printf("%d \n", new_num);
    return 0;
}

Для шестнадцатеричных данных в массиве, как я могу манипулировать вышеуказанной программой для объединения шестнадцатеричных данных?

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Чтобы не сказать, что у вас есть ввод, как

int DATA[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

Если вы хотите вывод, подобный 0x0001020304050607, для хранения этого результирующего вывода вам нужна одна переменная типа unsigned long long. Например,

int main(void) {
        int DATA[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
        int ele = sizeof(DATA)/sizeof(DATA[0]);
        unsigned long long mask = 0x00;
        for(int row = 0; row < ele; row++) {
                mask = mask << 8;/* every time left shifted by 8(0x01-> 0000 0001) times   */
                mask = DATA[row] | mask; /* put at correct location */
        }
        printf("%016llx\n",mask);
        return 0;
}
0 голосов
/ 24 июня 2018

Вот какой-то хак, который записывает ваши данные прямо в целое число, без каких-либо побитовых операторов:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

uint64_t numberize(const uint8_t from[8]) {
    uint64_t r = 0;
    uint8_t *p = &r;

    #if '01' == 0x4849 // big endian
        memcpy(p, from, 8);
    #else // little endian
        for (int i=7; i >= 0; --i)
            *p++ = from[i];     
    #endif

    return r;
}

int main() {
    const uint8_t data[8] = { 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

    printf("result is %016llx\n", numberize(data));

    return 0;
}

Этот работает и выводит его независимо от порядка вашего компьютера:

result is 0201020304050607

Тест на устойчивость к времени компиляции был взят из этого SO ответа .

0 голосов
/ 24 июня 2018

Вам нужна 64-битная переменная num как результат, вместо 10 как фактор, который вам нужен 16, и вместо 100 как фактор, вам нужно 256.

Ноесли ваши данные представлены в виде массива байтов, то вы можете просто вставить полные байты, т. е. многократно сдвигать их на 8 бит (что означает коэффициент 256):

int main(void)
{
    uint8_t data[8] = { 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
    unsigned long long num = 0;
    for (int i=0; i<8; i++) {
        num <<=8;  // shift by a complete byte, equal to num *= 256
        num |= data[i];  // write the respective byte
    }
    printf("num is %016llx\n",num);
    return 0;
}

Вывод:

num is 0201020304050607
...