gpt4 book ai didi

将 uint32_t 转换为网络字节顺序

转载 作者:行者123 更新时间:2023-11-30 14:26:34 26 4
gpt4 key购买 nike

我正在为我的学习做一些事情,所以是的,这是家庭作业

首先:我有一个可用的 Java 服务器应用程序,我还有一个用 c 编写的客户端应用程序,现在用 java 运行。很简单,我无法将 uint32_t 发送到我的 java 服务器。

让我们展示一些代码:

char* callString(char func, char* str, uint32_t anz) {

uint32_t packageLength, funcLength, strLength;
funcLength = htonl(sizeof(func));
strLength = htonl(strlen(str));
uint32_t byte = htonl(4);
uint32_t trailing = htonl(1);
anz = htonl(anz);

packageLength = byte + byte + funcLength + byte + strLength + byte + byte + trailing;
/*packageLength = htonl(packageLength);*/

char byteBuffer[ntohl(packageLength)];


printf("%i\n", packageLength);
printf("%i\n", htonl(packageLength));
printf("%i\n", ntohl(packageLength));

sprintf(byteBuffer, "%i%i%c%i%s%i%i%c", packageLength, byte, func, byte, str, byte, anz, '\0');

printf("%s\n", byteBuffer);

if(write(sock, byteBuffer, packageLength) < 0) {
printf("write: Konnte keine Daten zum gegenüber senden.\n");
exit(EXIT_FAILURE);
}
char* retVal = "hallo";
return retVal;
}

很简单,我用 func = 'v'、str = "hallo"和 anz = 2 来调用这个函数这将为我提供 27 个字节的 packageLength。

包是这样构建的:
= packageLength (int) 为 4 字节
+ 函数描述符的长度(funcLength)为 4 字节
+ 函数描述符(func),即 funcLength
+ param1 的长度 (strLength) 为 4 字节
+ param1 (str) 值的长度,即 strLength
+ param2 的长度为 4 字节
+ param2 (anz) 值的长度,为 4 字节
+ NULL 字节 (\0),即 1 个字节

我认为我所做的转换是错误的,也许我使用了错误的数据类型。在服务器端,我使用 Java ByteBuffer 来收集数据。首先,我从网络读取 4 字节的包长度,这将为我提供需要读取多长时间才能获得整个数据包的信息:

byte[] msgLength = new byte[4];
try {
handle.getInputStream().read(msgLength);
} catch (IOException ex) {
System.out.println("could not receive byte stream: msgLength");
break;
}
ByteBuffer receive;

receive = ByteBuffer.wrap(msgLength);

int packageLength = receive.getInt();
System.out.println("packageLength" + packageLength);

最后一个 println 将给出以下输出:

packageLength875901497

那么现在有人知道我的问题出在哪里吗?如果需要,我可以为您提供更多代码,但我认为错误要么是数据类型(uint32_t),要么是转换。

获得帮助。提前致谢。

干杯丹尼尔

最佳答案

funcLength = htonl(sizeof(func));
strLength = htonl(strlen(str));
uint32_t byte = htonl(4);
uint32_t trailing = htonl(1);
anz = htonl(anz);

packageLength = byte + byte + funcLength + byte + strLength + byte + byte + trailing;

您将尺寸转换为网络顺序,然后将它们加在一起以获得 packageLength。您应该在使用 htonl 将它们转换为网络顺序之前将它们添加在一起。

除此之外,所有这些:

sprintf(byteBuffer, "%i%i%c%i%s%i%i%c", packageLength, byte, func, byte, str, byte, anz, '\0');

是错误的,因为我假设您想将它们作为二进制发送,但是使用上面的 sprintf 会以基本 10 ASCII 表示形式发送它们(即您将数字作为文本发送!)

关于将 uint32_t 转换为网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com