亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 TFTP 傳輸的文件與主機上傳輸的文件大小不同

通過 TFTP 傳輸的文件與主機上傳輸的文件大小不同

拉莫斯之舞 2024-01-05 17:05:40
很長一段時間以來,我一直在努力在 Android 應用程序中處理 TFTP 協議。其主要功能是從托管 TFTP 服務器的定制設計設備下載文件。我正在瀏覽互聯網,希望找到一些好的、已經編寫好的實現。首先,我嘗試使用 TFTP 庫,它是 Apache Commons 的一部分。不幸的是沒有運氣 - 不斷超時甚至完全凍結。經過進一步研究,我在 github 上找到了一些代碼 -請看一下。我已經采用了 Android 代碼,經過一些調整,我終于收到了一些文件。該設備的創建者表示,塊大小應該正好是 1015 字節。所以我將包大小增加到1015并更新了創建讀取請求包的方法:DatagramPacket createReadRequestPacket(String strFileName) {    byte[] filename = strFileName.getBytes();    byte[] mode = currentMode.getBytes();    int len = rOpCode.length + filename.length + mode.length + 2;    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(len);    try {        outputStream.write(rOpCode);        outputStream.write(filename);        byte term = 0;        outputStream.write(term);        outputStream.write(mode); // "octet"        outputStream.write(term);        outputStream.write("blksize".getBytes());        outputStream.write(term);        outputStream.write("1015".getBytes());        outputStream.write(term);    } catch (IOException e) {        e.printStackTrace();    }    byte[] readPacketArray = outputStream.toByteArray();    return new DatagramPacket(readPacketArray, readPacketArray.length, serverAddr, port);}正在下載塊,但有一個主要問題 - 我下載的文件是分成幾部分的,每個部分 512kB(除了最后一個),而我在 Android 設備上收到的每個部分大約大 0.5kB??雌饋砗孟衩看味嘁粋€字節或者多一整個附加。顯然我不完全理解它并且我錯過了一些東西。
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

我知道出了什么問題。這種奇怪的行為是收到最后一個數據包時這一行的結果:

byte[] fileDataBytes = pktFactory.getDataBytes(dPkt);

返回的數組大小始終等于指定的數據包長度,即使接收到的數據較小。在我的例子中,最后一個數據包是 0 字節(tftp 為 +4 字節),但即便如此,額外的 512 字節還是添加到了輸出流中。

為了解決這個問題,我使用額外的參數重載了提到的方法 - 當接收到的數據大小高于 4 字節且低于指定的數據包大?。?12 字節)時,接收到的數據包的實際大小。此更改導致獲得最后一個數據包的數組的正確大小,因此接收到的文件在操作結束時具有正確的大小。


查看完整回答
反對 回復 2024-01-05
  • 1 回答
  • 0 關注
  • 296 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號