bcoder

Java中使用ByteBuffer处理tcp粘包

 分类:Android, Java, Java语言 阅读 (3,443)  Java中使用ByteBuffer处理tcp粘包已关闭评论
8月 222019
 
一、通讯数据格式

通讯协议的约定格式如下:

每一个数据包的长度不固定,但是前四个字节代表的意义是固定的

数据的长度取决于第3个字段的值

名称 长度 其他说明  
协议头 2字节 固定的两个字节,用以给协议分段  
数据类型 1字节 数据内容的类型,用以区别多种内容  
数据长度 1字节 后面数据内容的长度,1字节可表示最大长度是255  
数据 n字节 n取决于上一个字节中的数值  
     
     
     
二、处理的难点
  1. 长度不固定,解析每一组数据时需要先想办法获取数据的长度
  2. 如果发送速度很快,收到一包可能有多组数据,需要一个while循环处理收到的一包的数据(这也就是粘包处理的初衷)
  3. 收到一包数据(本例中使用1024长度的缓冲区接收)可能将某个数据包截成两截,当前缓冲区未解析完的要保留下来,否则会丢数据
三、处理流程图
四、代码

在while(true)里面是读取tcp数据和进行粘包处理的代码

五、其他说明

  1. 串口通讯的粘包处理也可以使用此方法

java中的左移<<操作符

 分类:Java, Java语言 阅读 (1,841)  java中的左移<<操作符已关闭评论
8月 162019
 

对于正数来说,左移1位相当于这个数值翻倍,或者对于类型为int的负数来说,左移一位也是翻倍

但是对于类型小于int的类型,比如short和byte,本来以为左移并不会带符号,但经过测试不是这样的,看代码:

左移后为int型数值,本来以左移8位后,前16位会用0填充,但是没有,左移是带符号移位的,看运行结果如下:

好,我们再看看其他情况的。

1、byte为正数的情况,moveb = 2的运行结果

 

 

 Posted by on 2019-08-16

软件开发中用到的几种图

 分类:Others, Others 阅读 (1,282)  软件开发中用到的几种图已关闭评论
8月 152019
 

一、思维导图

二、流程图

三、DFD数据流图

四、时序图

五、UML类图

 Posted by on 2019-08-15

java中的右移>>和无符号右移>>>

 分类:Java, Java语言 阅读 (5,584)  java中的右移>>和无符号右移>>>已关闭评论
8月 062019
 

右移>>是指带符号右移,如果最高位的符号位为1,则右移时左侧补上的空位用1填充,否则用0填充

而无符号右移>>>,不管左侧最高位是1还是0,左侧补上的空位统统用0填充,如下面的例子:

看输出结果:

我们从第13位开始左移,即第二字节的101那里,左移后的结果如下,右侧应该有一些0用省略号代替了

101 11110100 01010100…..

我们再右移29位,即只剩下101,那么如果用>>前面将被补上很多的1,如果使用>>>,则会补很多0

 Posted by on 2019-08-06

gradle中动态修改生成的apk的文件名

 分类:Android, Java 阅读 (1,521)  gradle中动态修改生成的apk的文件名已关闭评论
8月 062019
 

在app/build.gradle中的android节点中增加如下代码:

myapp_固定的名称

buildType.name 为release或者debug

${variant.versionName}为versionName

${variant.versionCode}为versionCode

生成的apk的文件名为myapp_debug.apk

 Posted by on 2019-08-06

Java数据类型转换的一些问题总结

 分类:Java, Java语言, Uncategorized 阅读 (1,354)  Java数据类型转换的一些问题总结已关闭评论
8月 062019
 
一、强制类型转换导致数据的变化

举例:short类型的值范围为-32768 ~ 32767,看下面这些对short值的操作

最后的输出结果为:

二、关于一些运算后生成的默认值

对于长度小于或者等于int的数据类型,如short, byte在进行如下运算后,其他运算结果为int型

<<,>>,>>>,&,|,^,+,-,*,/

如下代码,就会提示你将运算强制转换成short类型

三、有符号数转无符号数

可以通过&运算将有符号号转为无符号数,

对于byte类型& 0xFF,

对于short类型& 0xFFFF,

对于int类型& 0xFFFFFFFF

注意&运算完的结果是一个int型的值

下面看一个示例代码:

运行结果:

强制类型转换并没有改变符号。

四、负数的左移位操作

负数的左移位操作会使数据保持为负数

http://bcoder.com/java/right-shift-operator-in-java

 Posted by on 2019-08-06

Windows和Ubuntu双系统磁盘不能写的问题处理

 分类:Linux, Operating System, Windows 阅读 (802)  Windows和Ubuntu双系统磁盘不能写的问题处理已关闭评论
7月 122019
 

Windows和Ubuntu18双系统,最近从Windows系统切回ubuntu后windows的E盘可读不可写

从网上查可通过ntfsfix命令来解决,如下:

 

如果上述命令失败,可以先尝试umount一下,如下:

umount /dev/sdb3

 Posted by on 2019-07-12

树莓派gpio编程(一)控制Led灯

 分类:C++, Linux, Operating System, Others, Uncategorized 阅读 (2,562)  树莓派gpio编程(一)控制Led灯已关闭评论
7月 112019
 
一、编程语言

  个人比较喜欢c语言,所以后面的编程都会使用c语言。

  使用c语言的话可以使用用wiringPi类库。

  1、查看是否安装wiringPi类库,输入下面的命令,如果返回版本信息则表示已安装wiringPi库

  2、如果没有安装,输入下面的命令安装

  3、wiringPi源码

  github上有一个wiringPi的代码库,但那个并不是wiringPi的源码,其源码在下面这个地址中

  https://git.drogon.net/

二、硬件连接

  将Led灯的两个针脚分别连到GND和GPIO0两个接口上,网上有的教程还说要连上一个电阻,但是俺没有,就直接连上了。

三、软件编写

  新建一个ledblink.c文件,然后输入下面的代码

四、软件编译

  输入下面的命令编译

五、执行程序查看效果

  编译完成后,会生成一个ledblink的可执行程序,输入./ledblink运行,看led灯是不是开始闪烁了!

 Posted by on 2019-07-11

Laravel中编写事件和事件监听器

 分类:PHP 阅读 (1,809)  Laravel中编写事件和事件监听器已关闭评论
7月 112019
 
一、简单介绍事件和监听器

  事件Event:主要用做数据的载体,里面只是包含要传递的数据。

  监听器Listener:事件真正被触发的地方,其handle方法接受传入的Event对象,并在此处理Event中带来的数据。

二、首先定义事件和事件监听器

  打开App\Providers\EventServiceProvider.php,给$listen数组赋值要添加的事件和监听器,可定义多个事件,每个事件也可以定义多个监听器。

  比如:

三、在控制台生成相关文件

  在控制台输入命令:

  php artisan event:generate

  执行完以后可以看到App\Event和App\Listeners两个目录下多了相应的php类

四、定义Event类

  Event类主要用于运输数据,在_construct函数的参数中传入,并将值保存在内部成员变量中,示例如下:

五、Listener中处理事件

六、触发事件

  比如在用户登录成功的地方调用前面定义的事件

 

Linux下使用dd制作树莓派系统盘

 分类:Linux, Operating System, Others, Others 阅读 (3,217)  Linux下使用dd制作树莓派系统盘已关闭评论
7月 052019
 
一、文章背景

  本文基于Ubuntu16,pi zero WH,树莓派镜像版本2019-06-20_raspbian_full

  树梅派官方推荐使用Etcher制作镜像,但是下载速度实在是太慢了,使用dd也可以搞定。

二、下载镜像

  官网镜像下载地址:https://www.raspberrypi.org/downloads/raspbian/

  首先下载树梅派系统镜像包,是一个zip文件,如:2019-06-20_raspbian_full_latest.zip

  解决zip包后得到img镜像文件,如:2019-06-20-raspbian-buster-full.img

三、准备sd卡

  将sd卡连接电脑,然后执行df -h

  拔掉sd卡后再执行一次df -h

  有变化的那一项即是sd卡的设备名称,如:/dev/sdc1

  /dev/sdc即是sd卡的主设备名,先执行下面命令卸载它的子分区

  假如还有sdc2、sdc3统统卸载掉

四、烧录系统

  执行下面的命令烧录系统

  if=后面是镜像所在的路径

  of=后面是sd卡设备名称

 Posted by on 2019-07-05