文件上傳簡單服務端和客戶端 Java 實現

背景

樓主最近很悲慘,下載了 Android 的源碼,而後 mac 的硬盤空間就沒了,並且編譯 Android 源碼須要將建立一個大小寫不敏感的分區,因此須要將源碼存在別的地方,最初是使用的硬盤,可是失敗了(硬盤用的 exfat 格式), 後來用雲盤,筆記,QQ 都不行,要麼文件過多不給傳,要麼要收費,總之就是不行,正當躊躇之際,想起了一句老話,'本身動手,豐衣足食', 因此萌生了本身寫個工具的念頭,固然,給本身用的,不須要寫的那麼好,可是寫的過程當中出現了一些小問題,因此寫這篇博客記錄一下。java

問題與解決

在設計報文的時候,須要將 int 與 byte, long 與 byte 互轉,轉化的算法天然是沒啥問題,可是恰恰 byte 轉 int ,或者 byte 轉 long 有時出現的結果不正確,最後發現是 java 類型的隱士轉化的問題,主要是 java 沒有無符號類型,因此若是 byte 最高位是 1,那麼移位的時候會將 byte 轉化爲 int, 這時候 int 的符號爲會變成 1, 致使結果不對。git

解決方案就是將轉化爲的 int 或者 long 只保留低 8 爲, 也就是與 0xFF 作 & 運算,由於只有低 8 位是可用的。主要是去掉高位的符號位github

整型與字節相互轉換工具類代碼

 1 public class ByteUtils {
 2 
 3     public static int toInteger(byte[] buff, int start){
 4         int ret = 0;
 5         if (buff != null && buff.length >= 4 && start + 4 <= buff.length){
 6             ret = ((buff[start] & 0xFF) << 24) | ((buff[start + 1] & 0xFF) << 16) | ((buff[start + 2] & 0xFF) << 8) | (buff[start + 3] & 0xFF);
 7         }
 8         return ret;
 9     }
10 
11     public static byte[] tobyte(int i){
12         byte[] ret = new byte[4];
13 
14         ret[0] = (byte) (i >> 24 & 0x000000FF);
15         ret[1] = (byte) (i >> 16 & 0x000000FF);
16         ret[2] = (byte) (i >> 8 & 0x000000FF);
17         ret[3] = (byte) (i & 0x000000FF);
18 
19         return ret;
20     }
21 
22     public static long toLong(byte[] buff, int start) {
23         long ret = 0;
24         if (buff != null && start + 8 <= buff.length){
25             ret = ((buff[start] & 0xFFl) << 56) | ((buff[start + 1] & 0xFFl) << 48) | ((buff[start + 2] & 0xFFl) << 40) | ((buff[start + 3] & 0xFFl) << 32)
26                 | ((buff[start + 4] & 0xFFl) << 24) | ((buff[start + 5] & 0xFFl) << 16) | ((buff[start + 6] & 0xFFl) << 8) | (buff[start + 7] & 0xFFl);
27         }
28         return ret;
29     }
30 
31     public static byte[] tobyte(long i){
32         byte[] ret = new byte[8];
33 
34         ret[0] = (byte) (i >> 56 & 0x000000FF);
35         ret[1] = (byte) (i >> 48 & 0x000000FF);
36         ret[2] = (byte) (i >> 40 & 0x000000FF);
37         ret[3] = (byte) (i >> 32 & 0x000000FF);
38         ret[4] = (byte) (i >> 24 & 0x000000FF);
39         ret[5] = (byte) (i >> 16 & 0x000000FF);
40         ret[6] = (byte) (i >> 8 & 0x000000FF);
41         ret[7] = (byte) (i & 0x000000FF);
42 
43         return ret;
44     }
45 }
View Code

 

項目地址

項目比較簡陋,可是夠本身用了 github 地址算法

相關文章
相關標籤/搜索