java byte数据转换和处理总结 java程序或Android程序的socket数据传输,都是通过byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型。
一.byte和int相互转换的方法: /** * int到byte[] * @param i * @return */ public static byte[] intToByteArray(int i) { byte[] result = new byte[4]; // 由高位到低位 result[0] = (byte) ((i >> 24) & 0xFF); result[1] = (byte) ((i >> 16) & 0xFF); result[2] = (byte) ((i >> 8) & 0xFF); result[3] = (byte) (i & 0xFF); return result; } /** * byte[]转int * @param bytes * @return */ public static int byteArrayToInt(byte[] bytes) { int value = 0; // 由高位到低位 for (int i = 0; i < 4; i++) { int shift = (4 - 1 - i) * 8; value += (bytes[i] & 0x000000FF) << shift;// 往高位游 } return value; } //测试数据 public static void main(String[] args) { byte[] b = intToByteArray(128); System.
什么是ContentProvider 1.ContentProvider是android四大组件之一; 2.ContentProvider是一种数据包装器/发布者,它提供统一的接口对数据进行操作,调用者不用关心数据到底是如何存储的; 3.ContentProvider主要用于不同应用程序间和不同进程间的数据共享。
什么是ContentResolver 1.ContentResolver是数据调用者,ContentProvider将数据发布出来后,通过ContentResolver对象结合Uri进行调用 2.通过ContentResolver可以调用ContentProvider的增,删,改,查操作。
什么是Uri 1.通用资源标识符 2.Uri代表要操作数据的地址。每个ContentProvider发布数据时都有一个唯一的地址。
创建自定义ContentProvider的步骤 1.使用SQLite技术,创建好数据库和数据表; 2.新建类继承ContentProvider; 3.创建UriMatcher,定义Uri规则; 4.重写6个抽象方法(onCreate,insert,delect,getType,update,query); 5.在AndroidManifest中注册provider; 6.ContentResolver对ContentProvider共享的数据进行增删改查。
代码实例 在之前创建的项目StudentTest基础上进行操作,这个项目里已经创建好数据库student_db和数据表student,StudentTest里只包含一个表格student,所以不需要使用UriMatcher,若项目里不止一张表,那么就需要用到UriMatcher来进行判定了,下面会分别就这两种情况进行讲解。 首先是只有一张student表: 需要创建子类StudentContentProvider继承ContentProvider,一般情况下有两种创建方法: 1.new——>Java class,继承ContentProvider方法,重写6个抽象方法,还需要在AndroidManifest中注册provider; 2.new——>others——>Content Provider,这是创建Content Provider的快捷方法,系统会自动生成继承ContentProvider方法和在AndroidManifest中注册provider。
public class StudentContentProvider extends ContentProvider { public StudentContentProvider() { } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } } 发布者ContentProvider已就绪,需要数据调用者ContentResolver,所以新建project(TeacherTest).
第一章:环境搭建与开发相关(已完结 10/10)https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程——1.1 背景相关与系统架构分析Android基础入门教程——1.2 开发环境搭建Android基础入门教程——1.2.1 使用Eclipse + ADT + SDK开发Android APPAndroid基础入门教程——1.2.2 使用Android Studio开发Android APPAndroid基础入门教程——1.3 SDK更新不了问题解决Android基础入门教程——1.4 Genymotion模拟器安装Android基础入门教程——1.5.1 Git使用教程之本地仓库的基本操作Android基础入门教程——1.5.2 Git之使用GitHub搭建远程仓库Android基础入门教程——1.6 .9(九妹)图片怎么玩Android基础入门教程——1.7 界面原型设计Android基础入门教程——1.8 工程相关解析(各种文件,资源访问)Android基础入门教程——1.9 Android程序签名打包Android基础入门教程——1.10 反编译APK获取代码&资源 第二章:Android UI(User Interface)详解(已完结 40/40) Android基础入门教程——2.1 View与ViewGroup的概念 六大布局
Android基础入门教程——2.2.1 LinearLayout(线性布局)Android基础入门教程——2.2.2 RelativeLayout(相对布局)Android基础入门教程——2.2.3 TableLayout(表格布局)Android基础入门教程——2.2.4 FrameLayout(帧布局)Android基础入门教程——2.2.5 GridLayout(网格布局)Android基础入门教程——2.2.6 AbsoluteLayout(绝对布局) 常用基本UI控件
Android基础入门教程——2.3.1 TextView(文本框)详解Android基础入门教程——2.3.2 EditText(输入框)详解Android基础入门教程——2.3.3 Button(按钮)与ImageButton(图像按钮)Android基础入门教程——2.3.4 ImageView(图像视图)Android基础入门教程——2.3.5.RadioButton(单选按钮)&Checkbox(复选框)Android基础入门教程——2.3.6 开关按钮ToggleButton和开关SwitchAndroid基础入门教程——2.3.7 ProgressBar(进度条)Android基础入门教程——2.3.8 SeekBar(拖动条)Android基础入门教程——2.3.9 RatingBar(星级评分条)Android基础入门教程——2.3.10 ScrollView(滚动条)Android基础入门教程——2.3.11 Date & Time组件(上)Android基础入门教程——2.3.12 Date & Time组件(下) Adapter类的控件
Android基础入门教程——2.4.1 Adapter基础讲解Android基础入门教程——2.4.2 ListView简单使用Android基础入门教程——2.4.3 BaseAdapter优化Android基础入门教程——2.4.4 ListView的焦点问题Android基础入门教程——2.4.5 ListView之checkbox错位问题解决Android基础入门教程——2.4.6 ListView的数据更新问题Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapterAndroid基础入门教程——2.4.8 ListView Item多布局的实现Android基础入门教程——2.4.9 GridView(网格视图)的基本使用Android基础入门教程——2.4.10 Spinner(列表选项框)的基本使用Android基础入门教程——2.4.11 AutoCompleteTextView(自动完成文本框)的基本使用Android基础入门教程——2.4.12 ExpandableListView(可折叠列表)的基本使用Android基础入门教程——2.4.13 ViewFlipper(翻转视图)的基本使用Android基础入门教程——2.
在没有路由器,自己电脑又不想下载wifi软件的情况下,可以使用本机网络开启wifi热点(CMD命令)。
win+R 运行cmd 进入到控制台
第一步输入:netsh wlan set hostednetwork mode=allow ssid=WIFI_NAME key=WIFI_PASSWORD
直接回车
回车后会显示
解析:ssid 是指wifi显示的名称
key 是指设置的wifi密码
只需换成自己需要的就可以了
第二步输入:netsh wlan start hostednetwork
输入后直接回车
显示 这时正常的话会在网络与共享中心那边会多了一个 本地连接 适配器
代表你已经成功了一半。还有一半就是要把你的网络设置为共享
第三部:设置网络共享
1)、首先进入到 网络和共享中心--->点击左边更改适配器
2)、选中你连接网络的适配器(是本地网络入口的适配器,不是刚刚新建的)右键--->共享---->勾选允许其他网络用户链接,
在选择专用网络连接上选择刚刚创建的wifi适配器(默认情况下是一个叫 “本地连接”后面可能会有一个数字)即可
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jquery点击弹出登陆窗口</title>
<link rel="stylesheet" type="text/css" href="http://sandbox.runjs.cn/uploads/rs/55/sjckzedf/lanrenzhijia.css">
<script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/55/sjckzedf/jquery-1.8.0.min.js"></script>
<script>
jQuery(document).ready(function($) {
$('.theme-login').click(function(){
$('.theme-popover-mask').fadeIn(100);
$('.theme-popover').slideDown(200);
})
$('.theme-poptit .close').click(function(){
$('.theme-popover-mask').fadeOut(100);
$('.theme-popover').slideUp(200);
})
})
</script>
</head>
<body>
<div class="theme-buy">
<a class="btn btn-primary btn-large theme-login" href="javascript:;">点击查看效果</a>
</div>
<div class="theme-popover">
<div class="theme-poptit">
<a href="javascript:;" title="关闭" class="close">×</a>
<h3>登录 是一种态度</h3>
</div>
<div class="theme-popbod dform">
<form class="theme-signin" name="loginform" action="" method="post">
<ol>
一:继承中的指针问题。(基类指针指向派生类对象)
1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D dd; p=&dd是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不知道派生类中的这些成员。
2. 不能使派生类指针指向基类对象.
3. 如果派生类中覆盖了基类中的成员变量或函数,则当声明一个基类指针指向派生类对象时,这个基类指针只能访问基类中的成员变量或函数。例如:基类B和派生类D都定义了函数f,则B *p; D m; p=&m; m.f()将调用基类中的函数f()而不会调用派生类中的函数f()。 4. 如果基类指针指向派生类对象,则当对其进行增减运算时,它将指向它所认为的基类的下一个对象,而不会指向派生类的下一个对象,因此,应该认为对这种指针进行的增减操作是无效的.
5.上面讲解了基类指针指向其派生类对象的用法,下面的代码将阐述为什么要使用基类指针指向其派生类对象:它可以实现多态性。即向不同的对象发送同一个消息,不同的对象在接受时会产生不同的行为。C++支持两种形式的多态性。第一种是编译时的多态性,称为静态联编。第二种是运行时的多态性,也称为动态联编。运行时的多态性是指必须在运行中才可以确定的多态性,是通过继承和虚函数来实现的。继承同一基类的不同派生对象,对来自基类的同一消息执行了不同的行为,这就是多态。
#include <iostream> using namespace std; class Shape { public: virtual double area() const = 0; //纯虚函数 }; class Square : public Shape { double size; public: Square(double s) { size = s; } virtual double area() const { return size * size; } }; class Circle : public Shape { double radius; public: Circle(double r) { radius = r; } virtual double area() const { return 3.
1. 下载安装包
wget url(libreoffice下载网址) 个人是自己下载到本地传上去的,因为文件比较大
上传命令(cmd):
pscp libreoffice_X.X.X_..._rpm.tar.gz root@IP:/opt/soft/(自选目录) 安装包解压
tar -xvf libreoffice_..._rpm.tar.gz 到解压后的文件夹下
cd libreoffice_..._rpm/ 可以看到有三个文件
>install
>readmes
>RPMS
cd RPMS/ RPMS文件下有很多rpm文件
yum install *.rpm 安装完成(此时可以使用命令对文件进行操作,例如转PDF)
转PDF命令:
/opt/libreoffice5.4/program/soffice --headless --convert-to pdf:writer_pdf_Export /opt/backup/201803130010.xls --outdir /opt/backup/ 2.语言包的安装步骤同上,需要下载语言包
3.字体安装
个人在使用命令行转PDF的时候,中文会出现乱码,因此,将C:\Windows\Fonts下的simsun.ttc拷贝到/usr/share/fonts/simsun下,simsun为个人新建文件夹
[root@CentOS~]#cd /usr/share/fonts/simsun [root@CentOS~]#mkfontscale [root@CentOS~]#mkfontdir [root@CentOS~]#fc-cache -fv 执行以上命令让字体生效 这样转PDF文件中文就会显示正常
4.如需安装依赖:(注意版本号)
/usr/bin/libreoffice5.1 --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard /opt/libreoffice5.1/program/soffice.bin: error while loading shared libraries: libcairo.so.2: cannot open shared object file: No such file or directory #缺少libcairo.so.2依赖库 yum install ibus 5.
JAVA byte[]、十六进制字符串、整形(Long、int)数据类型之间的转换 在编程中我们经常遇到数据类型之间的转换,现在我们来总结一下,有更好的请大家共享指导:
十六进制字符串数据 转 byte[]byte[] 转 十六进制字符串byte[] 转 int*int 转 byte[]byte[] 转 LongLong 转 byte[] 十六进制字符串数据 转 byte[] /** * 16进制字符串转byte * @param strIn * @return * @throws Exception */ public static byte[] hexStr2ByteArr(String strIn) { try { if (strIn==null)return null; byte[] arrB = strIn.getBytes(); int iLen = arrB.length; byte[] arrOut = new byte[iLen/2]; for (int i = 0; i < iLen; i = i + 2) { String strTmp = new String(arrB, i, 2); arrOut[i / 2] = (byte) Integer.
在使用键盘监听键盘事件时直接绑定没有任何反应。 直接在生命周期中进行绑定就可以了。
created : function(){ let _this = this; document. onkeydown = function( e){ let _key = window. event. keyCode; if( _key === 13){ _this. login( 1); } } },
微信小程序中,按钮也是<button></button>标签,它通过bindtap属性绑定点击事件:
然后在js里面注册这个回调函数:
回调函数里面通过
wx.navigateTo({
url: '/pages/index/talkPage',
})跳转到talkPage界面。
注意,html界面要在app.json里面注册:
不注册的话会报错:navigateTo:fail url "pages/index/talkPage" is not in app.json
注册完毕之后编译,开发工具会自动为你创建一个对应的js和wxss文件,而且js里面会自动搭好基本函数:
// pages/index/talkPage.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
1990年初,最初被命名为Oak;
1995年5月23日,Java语言诞生;
1996年1月,第一个JDK-JDK1.0诞生;
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术;
1996年9月,约8.3万个网页应用了Java技术来制作;
1997年2月18日,JDK1.1发布;
1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议纪录;
1997年9月,JavaDeveloperConnection社区成员超过十万;
1998年2月,JDK1.1被下载超过2,000,000次;
1998年12月8日,Java 2企业平台J2EE发布;
1999年6月,SUN公司发布Java三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME);
2000年5月8日,JDK1.3发布;
2000年5月29日,JDK1.4发布;
2001年6月5日,Nokia宣布到2003年将出售1亿部支持Java的手机;
2001年9月24日,J2EE1.3发布;
2002年2月26日,J2SE1.4发布,此后Java的计算能力有了大幅提升;
2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0;
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME;
2006年12月,SUN公司发布JRE6.0;
2009年4月20日,甲骨文以74亿美元的价格收购SUN公司,取得java的版权,业界传闻说这对Java程序员是个坏消息(其实恰恰相反);
2010年11月,由于甲骨文对Java社区的不友善,因此Apache扬言将退出JCP;
2011年7月28日,甲骨文发布Java SE 7;
2014年3月18日,甲骨文发表Java SE 8;
2017年7月,甲骨文发表Java SE 9。
2018年3月21日,甲骨文发表Java SE 10。
这里 其实 涉及到了 vue生命周期 当我们 引入jq 是不是 每次都要写$(function(){})或者是document.ready 等 代码 其实 这里可以看出 jq 生效也是有生命 周期得 所以 我们让jq 生效 必须在生命周期内 我们在这里 可以利用 vue生命周期 把jQuery中的代码放到mounted中 此时 就可以 生效了
看下图
linux命令学习(5)—— head -n #显示前5行 head -n 5 head.txt #显示前5个字节 head -c 5 head.txt
Linux服务器入侵预防与问题排查
弱口令入侵检查 有时候由于服务器系统账户存在弱口令的原因很容易被黑客破解或是一些入侵工具入侵,用
last命令用来列出目前与过去登录系统的用户相关信息,以下用查看恶意的入侵记录,
其中第一列:用户名
第二列:终端位置。(pts/0通过ssh或者telnet远程连接的用户,tty:直接连接到计算机或者本地用户)
第三列:登陆IP或者内核(看到0.0或者什么都没有,意味着用户通过本地终端连接,除了重启,内核版本会显示在状态中)
第四列:开始时间(如:sun apr 3 :四月三号星期天)
第五列:结束时间(still login in 还未退出,down:直到正常关机,crash:直到强制关机)
第六列:持续时间
root@VM-0-7-ubuntu:/# last
ubuntu pts/0 211.159.185.38 Fri Mar 23 20:12 still logged in
reboot system boot 4.4.0-91-generic Fri Mar 23 20:11 still running
ubuntu pts/1 119.28.7.195 Fri Mar 23 20:11 - 20:11 (00:00)
ubuntu pts/0 211.159.185.38 Fri Mar 23 20:06 - 20:11 (00:04)
reboot system boot 4.4.0-91-generic Fri Mar 23 20:05 - 20:11 (00:05)
//两种排序方法
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<string>vec;//定义个一个字符串容器
bool lexicographically(){
int i=0;
while(i<vec.size()-1){//vec.size() //返回容器中实际数据的个数。
if(vec[i].compare(vec[i+1])>0){
return 0;
}
i++;
}
return 1;
}
bool lengths(){
int i=0;
while(i<vec.size()-1){
if(vec[i].size()>vec[i+1].size())
{
return 0;
}
i++;
}
return 1;
}
int main(){
int i=0,n;
string str;
bool r1,r2;
cin>>n;
while(i<n){
cin>>str;
vec.push_back(str);//把字符串str压进容器,vec.pop_back();//取出容器中最后一个
i++;
}
r1=lexicographically();
r2=lengths();
if(r1&&r2){
cout<<"both";
}
else if(r1&&(!r2)){
cout<<"lexicographically";
}
else if((!r1)&&r2){
cout<<"lengths";
}
else{
cout<<"none";
}
return 0;
华为S5700交换机初始化和配置TELNET远程登录方法:
1,交换机开启Telnet服务
<Huawei>system-view #进入系统视图
[Huawei]telnet server ? #查看有enable还是disable选项,选择对应的开启方式。
[Huawei]telnet server enable #enable选项开启Telnet服务 (普通系列一般为这个)
[Huawei]undo telnet server disable #disable选项开启Telnet服务 (CE高端系列一般为这个)
2,配置VTY用户界面的最大个数(同时可以登录的最大数)
[Huawei]user-interface maximum-vty 15 #默认是5,这个可以不设置
3,配置VTY用户界面的终端属性
[Huawei]user-interface vty 0 14 #上面是15所有这里是0 14 如果选择默认这里是0 4
[Huawei-ui-vty0-14]protocol inbound telnet #配置vty支持telnet协议
4,配置VTY用户界面的用户验证方式
[Huawei-ui-vty0-14]authentication-mode aaa #配置用户终端的身份验证模式为aaa认证为aaa认证
[Huawei-ui-vty0-14]quit #退出vty配置界面
5,配置登录验证方式
[Huawei]aaa #进入aaa配置模式
[Huawei-aaa]local-user admin1234 password ? #查看可以选择的密码选择 [Huawei-aaa]local-user admin1234 password simple Huawei12#$ #密码选项simple 账号admin1234 密码Huawei12#$ (普通系列一般为这个)
[Huawei-aaa]local-user admin1234 password irreversible-cipher Huawei12#$ #密码选项irreversible-cipher 账号admin1234 密码Huawei12#$ (CE高端系列一般为这个)
http://blog.csdn.net/lddzzhengfeng/article/details/18548397
初步安装请参考baidu。
注意事项,如果出现pending在creating状态,提示redhat.cert相关的东西,请在各个node执行:
yum install *rhsm*
删除原有pod后,重新创建。
Word 2013 的多级列表设置 1.应用背景 在使用Word的时候,我们会经常使用到样式,而且有的时候由于内容的复杂性,一个标题下面会有多个分支标题,这时候我们使用样式的时候就有了一个根据标题的序号来自动对子标题进行编号的需求。
就如下面这个例子:
我们是需要让“相关函数”下面的子标题“比较常用的函数”能够自动编号。
2.步骤: 第一步:选中我们需要修改的样式标题,如演示案例中“标题4”。
第二步:找到段落设置--》多级列表。
第三步:选中定义“多级列表”。
第四步:将级别链接到样式中,就如图片中将级别1链接到标题2,需要特别注意的就是,下面的输入编号的格式,这个是最重要的,这个将直接影响到后面的自动编号,由于这个是第一个级别,所以没有包含的级别编号。
第五步:接下来我通过重新设置标题4“输入编号的格式”来解释一下子标题自动编号的原理。
如果我们只设置“此级别的编号样式”,那么在“输入编号的格式”中会多出一个1,这个1是用来自动增减的。
我们需要让子标题能够跟随着根标题来自动变化,所以我们需要设置“包含的级别编号来自”,我们先设置级别1,将其放入进去,效果如下:
我们需要自己加入那个".",再把级别2加入,效果如下:
点击确定进行保存。
我们看下效果:
3.问题 无法将新建的多级列表添加到目录中,我们需要重新设置目录及其索引以便让其能够在自动更新目录的时候将我们的多级列表添加进目录。
步骤 : 1.选中菜单栏中的引用,然后选目录。
2.选择自定义目录
3. 设置显示级别。
紧接着我们再更新一下目录,会发现已经成功将多级列表加入到目录中。
状况描述:window8.1操作系统,之前无论是连接WiFi还是直插网线都可以,今天来到北京却突然发现连的上
WiFi,却打不开浏览器, 我打开手机热点,笔记本却能好好的正常工作。
处理步骤:整整一天,各种百度,各种设置,各种修复软件下载,结果还是不行,吃完晚饭,从房东那得到路由器
的登录密码,去后台一看,连着呢,没有问题,各种配置都是OK的,最后得出结论,自己的笔记本的
问题;
问题根源:
第一步:右击下面这个网络图标,选择打开网络和共享中心;
第二步:选择这个连接的无线,点开它:
第三步:点开之后是这个样子的
第四步:选择无线属性,点开它,是这样的
第五步:选择安全,再选择里面的高级设置,然后把这个选项勾上就行了
弄完就发现神奇的可以了,可以了!!!
从早上八点到晚上八点,无数的尝试,说明只要我们不放弃,坚持下去,一定会找到原因的。
如果你的问题不是上面的原因,那么继续百度尝试吧,祝你好运!