Преобразование короткого массива без знака в байтовый массив в C - PullRequest
0 голосов
/ 27 мая 2018

Я хочу преобразовать необработанный массив шорт без знака в байтовый массив, а затем прочитать его обратно.Цель состоит в том, чтобы отправить данные через буфер SPI и прочитать их на другом конце.

Пример:

Отправитель:

unsigned short array[10] = {65000, 0, 6000, 15000, 100, 50, 1000, 10, 5000, 2000};
const uint8_t *data = charArrayToByteArray(array); // <-- convert it ?
send(data, sizeof(data)); // send it

Получатель:

uint8_t buf[10];
uint8_t len = sizeof(buf);  
receive(buf, &len); 
unsigned short array[10] = arrayByteToCharArray(buf); // convert it back ?

Рабочие функции:

send(const uint8_t* data, uint8_t len); //function that sends the data
receive(uint8_t* buf, uint8_t* len); // function that receives the data

Мне нужна помощь с charArrayToByteArray() и arrayByteToCharArray(), и размер данных не может быть скомпрометирован.Спасибо!

1 Ответ

0 голосов
/ 27 мая 2018

Поскольку ваш массив содержит такие значения, как 65000, которые нельзя отправить одним байтом, разумно предположить, что вы намереваетесь отправлять каждое значение в виде двух байтов.

Учитывая, что значения данных don 'не нужно быть обращенным вообще;скорее только тип указателя (так что вызов send() будет компилироваться).Так что этого должно быть достаточно:

unsigned short array[10] = {65000, 0, 6000, 15000, 100, 50, 1000, 10, 5000, 2000};
const uint8_t *data = reinterpret_cast<const uint8_t *>(array);
send(data, sizeof(array));

Обратите внимание, что вызов send() указывает sizeof(array), а НЕ sizeof(data);поскольку data является указателем, его размер составляет 4 или 8 байт (в зависимости от архитектуры вашего процессора) и не имеет никакого отношения к количеству байтов данных, которые вы хотите отправить!

Принимающая сторонааналогично:

uint16_t buf[10];
uint8_t len = sizeof(buf);  
uint8_t * data = reinterpret_cast<uint8_t *>(buf);
receive(data, &len); 

Обратите внимание, что после возврата receive(), len будет указывать количество полученных байтов , поэтому число полученных значений uint16_t будет вдвое меньше:

int numShortsReceived = len/sizeof(uint16_t);
for (int i=0; i<numShortsReceived; i++) printf("Received short #%i = %u\n", i, buf[i]);

Еще одно примечание: приведенный выше код не обрабатывает преобразования с прямым порядком байтов / байтов с обратным порядком байтов.Если вы можете гарантировать, что отправитель и получатель будут работать на процессоре с одинаковым порядком байтов, это не проблема.Если OTOH вам нужен этот код для правильной работы на смешанных процессорах (то есть с отправителем с прямым порядком байтов, отправляющим получателю с прямым порядком байтов, или наоборот), то вы захотите, чтобы ваш код отправки преобразовывал каждый из вашихuint16_t в сеть / big-endian перед отправкой (через htons()), а также чтобы ваш принимающий код преобразовал каждый из полученных uint16_t из сети / big-endian в его локальный порядковый номер (через ntohs()) после их получения (но прежде чем пытаться использовать их для чего-либо).

...