zoukankan      html  css  js  c++  java
  • 文件上传简单服务端和客户端 Java 实现

    背景

    楼主最近很悲惨,下载了 Android 的源码,然后 mac 的硬盘空间就没了,而且编译 Android 源码需要将创建一个大小写不敏感的分区,所以需要将源码存在别的地方,最初是使用的硬盘,但是失败了(硬盘用的 exfat 格式), 后来用云盘,笔记,QQ 都不行,要么文件过多不给传,要么要收费,总之就是不行,正当踌躇之际,想起了一句老话,'自己动手,丰衣足食', 所以萌生了自己写个工具的念头,当然,给自己用的,不需要写的那么好,但是写的过程中出现了一些小问题,所以写这篇博客记录一下。

    问题与解决

    在设计报文的时候,需要将 int 与 byte, long 与 byte 互转,转化的算法自然是没啥问题,但是偏偏 byte 转 int ,或者 byte 转 long 有时出现的结果不正确,最后发现是 java 类型的隐士转化的问题,主要是 java 没有无符号类型,所以如果 byte 最高位是 1,那么移位的时候会将 byte 转化为 int, 这时候 int 的符号为会变成 1, 导致结果不对。

    解决方案就是将转化为的 int 或者 long 只保留低 8 为, 也就是与 0xFF 做 & 运算,因为只有低 8 位是可用的。主要是去掉高位的符号位

    整型与字节相互转换工具类代码

     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 地址

  • 相关阅读:
    vue-cli webpack3扩展多模块打包
    性能对比:aelf智能合约运行环境性能是evm的1000倍
    aelf帮助C#工程师10分钟零门槛搭建DAPP&私有链开发环境
    ASP.NET Core依赖注入最佳实践,提示&技巧
    linux环境安装php fileinfo扩展
    简单的部署nodejs和web应用
    安卓NDK操作sqlite3
    [解决]微信小程序调用wx.login解密之后出现乱码的问题
    windows server 2008 iis 添加ssl证书
    Mac 下修改文件或文件夹的隐藏状态
  • 原文地址:https://www.cnblogs.com/zhangyan-2015/p/6553050.html
Copyright © 2011-2022 走看看