
bytes2HexStr怎么实现的,是不是其中for循环从下标1开始了。
buffer这个变量在哪里定义的,调试看下,在其中,是不是就少了第一个字节。
附上完整代码,感觉应该不是下标的问题。
public void sendPhoto(String imagepath, String imagename) throws Exception{
FileInputStream fs = new FileInputStream(imagepath);
BufferedInputStream bis = new BufferedInputStream(fs);
int mBufferSize = 1024*1024;
byte[] buffer = new byte[mBufferSize];
int photosize = bis.read();
int pageCount = (int)Math.ceil(((double)photosize / (double)mBufferSize));
System.out.println("pageCount="+pageCount);
int len = 0;
int i = 0;
//发送一个命令包
sendOrder(imagename, photosize, pageCount);
//读取文件,并将数据发送到服务端,并接收服务端返回的结果。如果传输失败,就重新传输
for(i = 0; i < pageCount; i++){
bis.skip( i * mBufferSize);//文件位置定位
len = bis.read(buffer);//得到内容, len记录得到内容的长度
String hexStr = bytes2HexStr(buffer);//byte数组转换成16进制编码的字符串
System.out.println("hesStr length = " + hexStr.length());
/*进行测试*/System.out.println(hexStr);
}
System.out.println("i="+i);
fs.close();
bis.close();
}
static String bytes2HexStr(byte[] byteArr) {
if (null == byteArr || byteArr.length < 1) return "";
StringBuilder sb = new StringBuilder();
for (byte t : byteArr) {
if ((t & 0xF0) == 0) sb.append("0");
sb.append(Integer.toHexString(t & 0xFF)); //t & 0xFF 操作是为去除Integer高位多余的符号位(java数据是用补码表示)
}
return sb.toString();
}
知道是什么问题了。
原来是方法用错了,int photosize = bis.read(); 是读取第一个字节的数据,并不是读取大小的,而且读完数据之后bis会指向下一个字节。
除此之外,len = bis.read(buffer);//得到内容, len记录得到内容的长度 在末尾的时候,会返回-1,所以不能使用len来作为函数的形参。