Поскольку ваш массив содержит такие значения, как 65000, которые не могут быть отправлены в виде одного байта, разумно предположить, что вы собираетесь отправлять каждое значение в виде двух байтов.
Учитывая это, значения данных вообще не нужно преобразовывать; скорее только тип указателя (так что вызов 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
в сеть/обратный порядок байтов перед их отправкой (через htons()
), а также для того, чтобы ваш код получения преобразовывал каждый из полученных uint16_t
из сети/обратного порядка байтов в его локальный порядок байтов (через ntohs()
) после их получения (но перед попыткой использовать их для чего-либо).
person
Jeremy Friesner
schedule
26.05.2018
unsigned short
(что не является незначительным соображением). Для этого не требуется никакого специального преобразования, кроме пары приведений указателя. - person John Bollinger   schedule 27.05.2018len
типаuint8_t
в ваших функцияхsend()
иreceive()
означает, что вы никогда не сможете отправлять или получать более 255 байтов за один вызов, что кажется немного ограничивающим. Если у вас есть возможность изменить его, вы можете заменить его наuint32_t
. - person Jeremy Friesner   schedule 27.05.2018