Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符数组转换为uint8\t_C_Casting_Send_Recv_Uint8t - Fatal编程技术网

C 如何将字符数组转换为uint8\t

C 如何将字符数组转换为uint8\t,c,casting,send,recv,uint8t,C,Casting,Send,Recv,Uint8t,我有一个服务器客户端应用程序,我正在开发,它基本上模拟了一个聊天室。这是学校的作业,协议规范有点严格 我有一个字符数组,它将存储来自客户端的所有消息 客户端必须首先将消息的长度作为uint8_t发送,然后将消息本身作为char数组发送 我的问题是我需要存储在发送实际消息之前发送的uint8_t值,但我只能使用消息数组存储来自客户端的任何信息 如果我没有弄错的话,char数组将不会存储发送过来的uint8\u t,除非我以某种方式强制转换它 如何将uint8\u t转换为字符并返回uint8\u

我有一个服务器客户端应用程序,我正在开发,它基本上模拟了一个聊天室。这是学校的作业,协议规范有点严格

我有一个字符数组,它将存储来自客户端的所有消息

客户端必须首先将消息的长度作为uint8_t发送,然后将消息本身作为char数组发送

我的问题是我需要存储在发送实际消息之前发送的uint8_t值,但我只能使用消息数组存储来自客户端的任何信息

如果我没有弄错的话,char数组将不会存储发送过来的uint8\u t,除非我以某种方式强制转换它

如何将uint8\u t转换为字符并返回uint8\u t

我试着在这里寻找一个类似的问题,但找不到一个例子

服务器.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 */
客户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, sizeof(clients_message), 0);
uint8_t length = 21;
char clients_message[] = "Hi how are you today?";
send(servers_sd, &length, sizeof(length), 0);
send(serers_sd, clients_message, length, 0);

如果您所处的体系结构中,
uint8\u t
typedef
unsigned char
(很可能是),那么只需将第一个
char
转换为
uint8\u t

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

它应该会起作用

char可以很容易地转换为uint8\t,但我不明白为什么需要在消息数组中存储长度。为什么不能只存储在变量中

以下是我认为可能会有所帮助的客户机和服务器的示例:

服务器.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 */
客户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, sizeof(clients_message), 0);
uint8_t length = 21;
char clients_message[] = "Hi how are you today?";
send(servers_sd, &length, sizeof(length), 0);
send(serers_sd, clients_message, length, 0);

字符
char
正好是一个字节(根据C标准的定义)。除非系统上的字节不完全是8位(存在这样的系统,但我打赌您从未使用过,甚至从未见过,
uint8\u 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
vs
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)
}
uint8\u t messageLength=0;
ssize_t bytesRead=recv(客户端和消息长度,1,0);
如果(字节读==-1){
//句柄读取错误
}
如果(字节读==0){
//处理流的末尾
}
字符消息[256];
bytesRead=recv(客户端,消息,消息长度,0);
如果(字节读==-1){
//句柄读取错误
}
如果(字节读==0){
//处理流的末尾
}
if(字节读取<消息长度){
//处理被截断的消息(消息太小)
}

再一次,显然有些人已经不理解我的第二句话了:我在上面写的所有内容都是基于这样的假设,即系统中的字节长度为8位。这段代码不能移植到字节大于或小于8位的平台,这已经是我的第二句话明确指出的,但这并不意味着我的回答是错误的。如果不允许编写不能移植到地球上所有现有平台的C代码,那么90%的现有C代码将被禁止。您知道您使用的平台,也知道您的应用程序针对的平台,因此您有责任确保代码适用于所有这些平台。

我来试一试。谢谢uint8\u t不能保证是字符类型的同义词。因此,使用is来别名所有类型(可能是字符类型)是不可移植的。@2501请解释“除非字节在您的系统上不完全是8位(这样的系统存在,但我打赌您从未使用过或甚至从未见过),uint8_t和char是完全相同的数据类型”的哪一部分。您完全不明白吗?你知道这个词的意思,除非?请不要再把我从未说过的话塞进我的嘴里。另外,请不要评论你显然没有读过的答案。@2501a
char
总是正好是一个字节,C标准要求这样做!如果一个字节在您的系统上有8位(我明确警告过,情况并非如此!!!),那么
uint8\u t
也是一个字节。请向全世界解释,一个字节如何不能是一个字节,因为C标准还要求,如果存在本机8位类型,
uint8\u t
必须是该类型,如果
char
是8位,那么这种本机类型必须存在。所以你的评论根本没有意义。我不是在说什么“话”。我们把它放在一边吧,因为它不相关。让我引用你的话:
uint8\u t和char是完全相同的数据类型。
我已经回答了:
uint8\u t不能保证是字符类型的同义词。
因此它们不是相同的类型。标准允许uint8_t不是字符类型的同义词,不管每个字节有多少位。这是可能的,因为扩展的整数类型。请参见:现行标准的7.20@4。(如果你想和我辩论的话,也请不要随便讨论。)我的评论应该包括你假设的每字节8位。这不是我的论点的问题,因为结论是一样的。C标准允许将uintN_t类型定义为不同于字符类型的扩展整数类型(第7.20条第4款)