2016-11-13 2 views
0

기본적으로 채팅 룸을 시뮬레이트하는 서버 클라이언트 응용 프로그램이 있습니다. 이것은 학교 과제이며 프로토콜 사양은 다소 엄격합니다.문자 배열을 uint8_t로 바꾸는 방법

클라이언트의 모든 메시지를 저장할 char 배열이 있습니다.

클라이언트는 먼저 메시지의 길이를 uint8_t로 보낸 다음 문자 배열로 메시지 자체를 보내야합니다.

내 문제는 실제 메시지가 전송되기 전에 보내지는 uint8_t 값을 저장해야하지만 메시지 배열을 사용하여 클라이언트에서 들어오는 정보 만 저장할 수 있습니다.

내가 잘못 입력하지 않으면 어떻게 든 캐스팅하지 않으면 char 배열에 uint8_t가 저장되지 않습니다.

uint8_t를 문자로 변환하고 다시 uint8_t로 변환 할 수 있습니까?

여기에도 비슷한 문제를 찾으려고했지만 예제를 찾을 수 없습니다.

server.c

char msg[100]; 
recv(clients_sd, msg, sizeof(msg), 0); 
uint8_t len; /* store the length of the message here */ 
char message_received[len]; 
recv(clients_sd, message_received, sizeof(message_received), 0); /* get and store the message here */ 

client.c

당신이 uint8_t는이 typedef unsigned char (당신은 가능성이 가장 높은)에, 단순히 걸릴 처음이다 아키텍처에 경우
uint8_t length = 21; 
char clients_message[] = "Hi how are you today?"; 
send(servers_sd, &length, sizeof(length), 0); 
send(serers_sd, &clients_message, sizeof(clients_message), 0); 

답변

3

char으로 캐스팅하고 uint8_t으로 캐스팅하십시오.

length = (uint8_t)(message_received[0]); 

제대로 작동합니다.

+0

나는 그 장면을 줄 것이다. 감사! – fatalError

0

char는 쉽게 uint8_t로 변환 될 수 있지만 왜 메시지 배열에 길이를 저장해야하는지 이해할 수 없습니다. 왜 변수에 저장할 수 없습니까?

server.c

uint8_t len; /* store the length of the message here */ 
recv(clients_sd, &len, sizeof(len), 0);  
char message_received[len]; 
recv(clients_sd, message_received, len, 0); /* get and store the message here */ 

client.c

uint8_t length = 21; 
char clients_message[] = "Hi how are you today?"; 
send(servers_sd, &length, sizeof(length), 0); 
send(serers_sd, clients_message, lentgth, 0); 
1

char가 정확히 : 여기

내가 도움이 될 수 있다고 생각 작은 변화와 클라이언트와 서버의 사용자의 예 1 바이트 (C 표준 정의 당). 바이트가 시스템에서 정확히 8 비트가 아니라면 (그러한 시스템은 존재하지만 결코 사용하지 않았거나 본 적이 없다고 생각합니다.) uint8_tchar은 정확히 동일한 데이터 유형입니다.

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' 

은 실제로 당신도 문자열 것을 수행 할 수 있습니다 당신은 데이터 유형과 같은 일을 할 수 있다면 당신은이 두 가지 데이터 유형 사이에 원하는대로

char c = 5; 
uint8_t u = c; 

는, 그때 당신은 포인터를 캐스팅 할 수 있습니다 문자열은 문자 배열이기도하므로 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' 

당신이 조심해야 할 유일한 것은 char 서명 또는 서명되지 않은 경우 C 표준이 정의하지 않는다는 것입니다. 기본적으로 서명 된 정수 유형 (예 : longunsigned 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 코드를 작성할 수없는 경우 기존 C 코드의 90 %가 금지됩니다. 작업중인 플랫폼을 알고 있고 앱으로 타겟팅하려는 플랫폼을 알고 있으므로 모든 플랫폼에서 코드가 올바른지 확인하는 것은 사용자의 책임입니다.

+0

uint8_t는 문자 유형의 동의어가 될 수 있습니다. 따라서 문자 유형이있을 수 있기 때문에 모든 유형의 별칭을 사용하는 것은 이식 가능하지 않습니다. – 2501

+0

@ 2501 "시스템에서 바이트가 정확히 8 비트가 아니라면 (단, 시스템을 사용하지 않았거나 본 적이 없다고 생각합니다.) uint8_t와 char은 정확히 동일한 데이터 유형입니다. * "정확히 이해하지 못했습니까? 당신은 그 단어의 의미를 안다? 내가 말한 적이없는 단어를 입에 넣지 마십시오. 또한 명확하게 읽지 않은 답변에 대해서는 언급하지 마십시오. – Mecki

+0

@ 2501'char'는 항상 정확히 1 바이트입니다. C 표준은 그것을 요구합니다! 그리고 만약 한 바이트가 시스템에 8 비트를 가지고 있다면 (** 그리고 나는 이것이 사실 일 필요는 없다는 것을 명시 적으로 경고했다 !!! **),'uint8_t '또한 바이트이다. C 표준은 또한 네이티브 8 비트 타입이 존재한다면'uint8_t'가 그 타입이어야하고'char '가 8 비트라면 8 비트라고 요구하기 때문에 바이트를 바이트가 될 수 없다는 것을 세계에 설명하십시오. 유형이 있어야합니다. 그래서 당신의 의견은 심지어 말이되지 않습니다. – Mecki

관련 문제