我正在做我的學習東西,所以是的,這是作業。轉換uint32_t到網絡字節順序
第一:我得到了一個可以工作的Java服務器應用程序,我也有這個客戶端應用程序,我現在用java編寫c程序。 很簡單,我無法將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」這個功能,海峽=「你好」和ANZ = 2 ,這將給我的packageLength 27個字節。
包是建立這樣的:
= packageLength(INT),它是4字節
+長度函數描述符(funcLength),它是4字節
+ FUNC描述符(FUNC),其是funcLength
的+長度參數1的(strLength),它是4字節
+長度的參數1(STR)的值,它是strLength
+長度param2的也就是4字節
+長度的參數2的值(ANZ),它是4字節
的+ NULL字節(\ 0)這是1個字節
我假設我做的轉換是錯誤的也許我使用了錯誤的數據類型。在服務器端,我使用Java ByteBuffer來收集數據。起初,我從網絡上讀取的4字節packagelength這會給我的,我有多少時間閱讀,直到我得到整個數據包的信息:
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)或轉換。
幫助被appriciated。提前致謝。
乾杯 丹尼爾
這是一些試驗和錯誤的作品,我做了。但我再次改變它,我得到這樣的
uint32_t packageLength, funcLength, strLength; funcLength = sizeof(func); strLength = strlen(str); anz = htonl(anz); packageLength = 4 + 4 + funcLength + 4 + strLength + 4 + 4 + 1; /*packageLength = htonl(packageLength);*/ strLength = htonl(strLength); funcLength = htonl(funcLength); uint32_t byte = htonl(4); uint32_t trailing = htonl(1); char byteBuffer[packageLength]; packageLength = htonl(packageLength);
– Daniel在Java中我有一個ByteBuffer是我把數據,它給了我的方法.putInt().put()把東西放在一個字節緩衝區,然後發送ByteBuffer 。我不知道如何將數據打包到字符數組中。 – Daniel
儘管如此,我在服務器端使用更改後的代碼(請參見上文)獲取相同的packageLength:packageLength875901497如何告訴c將二進制數據寫入套接字? – Daniel