文件上传简单服务端和客户端 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 }

项目地址

项目比较简陋,但是够自己用了 github 地址

时间: 2024-10-21 05:22:00

文件上传简单服务端和客户端 Java 实现的相关文章

文件上传,服务端压缩文件方法,重点是png与gif图片的压缩,保证了透明度与动画

1 /// <summary> 2 /// 上传文件帮助类 3 /// </summary> 4 public class ImageUploadHelper 5 { 6 7 #region SaveVideoFirstImg 根据视频路径生成视频对应的图片 8 /// <summary> 9 /// 根据视频路径生成视频对应的图片 10 /// </summary> 11 /// <param name="videoUrl">

Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门

说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. 本篇博客讲解: ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. 表单中的多选框参数接收. 文件的上传技术. ServletRequest : ServletRequest

多文件上传简单实现

五一假期后的第一天上班,无聊,做了一个简单的多文件上传,如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; usin

centos 6.5下安装文件上传下载服务

centos 6.5下安装文件上传下载服务 由于每次在CentOS中要下载一些配置文件到物理机,和上传一些文件到服务器,导致来回的开启ftp软件有点麻烦,这里我们可以使用文件上传下载服务,来解决上传和下载的问题. 1.登录服务器 2.执行命令:yum -y install lrzsz 3.执行rz命令进行文件上传.(注意,如果文件为二进制文件则需要执行:rz -be) 4. 执行[sz 文件名]命令进行文件下载.

atitit. 文件上传带进度条 atiUP 设计 java c# php

atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.xml 3 6. struts extand url 3 7. behide code 3 8. 简化设计 3 1. 设计要求 带进度条 完成提示动画效果.. 2. 原理and 架构 如果需要显示进度条,实时显示文件上传进度 需要使用Ajaxj技术..up到个在的iframe黑头.. 工作原理 其实际

文件上传更新服务相关

需求: 客户端向服务端发送一次请求,请求是一系列配置文件的文件名.当前客户端所持有文件的版本号.期待服务端返回的数据形式(url或二进制数据).当请求的配置文件有更新,服务端返回相应的url或二进制数据.之所以要分url和二进制数据,因为有的配置文件比较小且比较重要需要马上获取到数据:而有的配置文件稍微大一些,重要性比较低,可以在客户端拉线程慢慢下. 最终实现: 分为后台管理系统(负责文件上传)和数据更新服务. 文件上传部分是用Vue.js+KOA实现.其中关于文件上传那块,浏览器端使用Ajax

JavaScript,php文件上传简单实现

非ajax,非iframe,最原始使用file控件的文件上传,记录过程备忘. 实现目标,能够将文件上传到指定位置. 客户端用input的file控件: <form action='data.php' method='post' enctype='multipart/form-data'> <input type='file' name='file' /> <input type='submit' /> </form> 控件的name属性就是为了和服务器端通信

php部分---文件上传:错误处理、 客户端和服务器端的限制

1.客户端页面 <!---客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" -------> <body> <form action="doaction.php" method="post" enctype="multipart/form-data"> <input type="file&

C# 文件上传简单示例

Default.aspx <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>文件上传测试</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Fil