char
точно один байт (на определение стандарта C). Если байты не являются точно 8 битами в вашей системе (такие системы существуют, но я уверен, вы никогда не использовали или даже не видели один), uint8_t
и char
- это точно такой же тип данных.
char c = 5;
uint8_t u = c;
И если вы можете сделать что-то подобное с типом данных, то вы можете просто бросить указатели, как вы хотите между этими типами два данных:
char c[] = { 'H', 'e', 'l', 'l', 'o' };
uint8_t * u = (uint8_t *)c;
uint8_t x = u[1];
// x is 101, which is the ASCII char code of 'e'
На самом деле вы даже можете сделать это со строками , поскольку строка также представляет собой массив символов, только один, который заканчивается NUL
.
char * c = "Hello";
// "Hello" is in fact just { 'H', 'e', 'l', 'l', 'o', '\0' }
uint8_t * u = (uint8_t *)c;
uint8_t x = u[1];
// x is 101, which is the ASCII char code of 'e'
Единственное, что вам нужно быть осторожным в том, что стандарт C не определяет, если char
подписано или без знака. В отличие от целочисленных типов, которые по умолчанию подписаны и только без знака, если вы запрашиваете это (long
, например, unsigned long
), по умолчанию могут быть подписаны или без знака char
. Поэтому, если вам нужен один, вы должны использовать signed char
или unsigned char
в качестве типа данных. На практике это не играет никакой роли, если вы не выполняете определенные математические или логические операции по значениям char
(чего вы, вероятно, не должны делать в современном C-коде для начала).
И поскольку нет никакого способа, что ваше сообщение может быть больше, чем 256 символов (как в противном случае длина не будет вписываться в uint8_t
), а длина всегда ровно один байт, я бы написать код следующим образом:
uint8_t messageLength = 0;
ssize_t bytesRead = recv(clients_sd, &messageLength, 1, 0);
if (bytesRead == -1) {
// Handle read error
}
if (bytesRead == 0) {
// Handle end of stream
}
char message[256];
bytesRead = recv(clients_sd, message, messageLength, 0);
if (bytesRead == -1) {
// Handle read error
}
if (bytesRead == 0) {
// Handle end of stream
}
if (bytesRead < messageLength) {
// Handle truncated message (message too small)
}
И еще раз, поскольку, по-видимому, некоторые люди уже не понимают мое второе предложение: все, что я написал выше, в предположении, что байты в вашей системе имеют длину 8 бит. Этот код не переносится на платформы, где байты имеют более или менее 8 бит, это уже то, что ясно указывает мое второе предложение, но это не делает мой ответ неправильным. Если бы не было разрешено писать C-код, который не переносится на все существующие платформы на земле, 90% всего существующего кода C было бы запрещено. Вы знаете платформу, с которой работаете, и вы знаете, на каких платформах вы ориентируетесь с вашим приложением, поэтому ваша ответственность - убедиться, что код верен для всех этих платформ.
Я сделаю это. Благодаря! – fatalError