HTTP状态码分类

HTTP状态码分类

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

HTTP状态码分类
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

HTTP状态码列表

HTTP状态码列表
状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

mysql数据库相关思路备份

今天需要把A B两个网站的一些数据更新到C网站,数据结构使用B网站的,A B网站略有不同
思路如下:
1. 复制B数据库到C
2. 复制A数据库到临时数据库L
3. 同步L数据库的结构为B
4. 导出L数据
5. 导入C

中间可能用到的:

1. 不拷贝表数据,只拷贝结构。

CREATE TABLE new_table LIKE old_table

2. 通过 SELECT 查询来拷贝,new_table 表会丢失主键、索引等信息。

引用

CREATE TABLE new_table AS( SELECT * FROM old_table)

3. 完全拷贝表

CREATE TABLE new_table LIKE old_table;INSERT INTO new_table SELECT * FROM old_table;

4. 仅拷贝字段

CREATE TABLE new_table AS( SELECT field1, field2 FROM old_table)

5. 部分拷贝

CREATE TABLE new_table AS( SELECT * FROM old_table WHERE field1 = ‘mangguo’)

CentOS 5.2下Openfire服务器配置笔记

1.java环境搭建

chmod +x jdk-6u25-linux-x64.bin
./jdk-6u25-linux-x64.bin
mv jdk1.6.0_25/ /usr/local/jdk
vim /etc/profile ADD
最后加上如下
—————————————–
JAVA_HOME=”/usr/local/jdk”
CLASS_PATH=”$JAVA_HOME/lib:$JAVA_HOME/jre/lib”
PATH=”.:$PATH:$JAVA_HOME/bin”
export JAVA_HOME
—————————————-

source /etc/profile

2.下载安装openfire

wget http://download.igniterealtime.org/openfire/openfire-3.8.1-1.i386.rpm

rpm -ivh openfire-3.8.1-1.i386.rpm
/etc/init.d/openfire start
/etc/init.d/openfire restart

3.配置 openfire

http://localhost:9090
为了更好地支持中文请输入以下的Mysql连接

jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=utf8

4.下载用户终端

 

http://www.igniterealtime.org/projects/spark/index.jsp

 

http://www.pandion.be/download/start

5 如果需要Nginx做代理

打开nginx的配置文件nginx.conf,增加如下行:
 #gzip  on;
#增加
   upstream bk.openfire {
        server 127.0.0.1:7070;
    }
location / {
            root   html;
            index  index.html index.htm;
}
后面增加 :
location /http-bind {
            proxy_pass http://bk.openfire;
            proxy_buffering off;
            proxy_redirect off;
            proxy_read_timeout 120;
            proxy_connect_timeout 120;
}

黑字为原来的配置, 红色为需要增加的行。

openfire 安装目录 /opt/openfire

 

 

BAT合并文件以及统计数

近期公司采集数据,大概一个文件夹下60万+的txt文档,需要做一个合并,然后清空这些文档,bat如下
————————————————————-

set /p all=复制文件名:
copy *.txt %all%.txt
copy %all%.txt D:\%all%user.txt
del *.txt

 

————————————————————-

统计这些文件的行数(计算采集用户数)
——————————————————

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET lines=0
FOR /F "tokens=* delims=" %%i IN (%1) DO (
    SET /A lines=!lines!+1
)
ECHO !lines!

 

————————————————–
以上代码另存为wc.bat
使用代码  wc xxx.,txt

用apktool+dex2jar+jd_gui反编译apk文件

这三个软件google一下都可以免费下载使用。
我们可以反编译一些软件来学习人家的架构及界面等。
apktool: 可以解析资源文件,比如布局文件xml等,方便查看。
这个简单,不用介绍。
dex2jar:可以将dex文件转换成jar文件
用法:
1.将apk文件后缀改成rar,然后解压,取出其中的classes.dex,放到任意位置;
2.进入cmd,cd到dex2jar所在文件夹,输入命令dex2jar.bat %classes.dex所在目录%\class.dex
3. 命令完成后在%class.dex所在目录%就会生成jar文件

jd_gui:能够将jar文件反编译成java代码
用法:
打开jd_gui,然后将jar包拖放到主界面,就可以看到源代码了。

通过snoopy模拟登陆其他有验证码的网站

实现需求:
通过snoopy获得A站sessionid和验证码图片,在自己的网站上显示登陆表单,提交后,snoopy提交输入信息到A站实现登陆,并获取里面的资料作分析。

验证码和sessionid的获取:
//获取图片
$snoopy->fetch(‘http://www.a.com/imgcode.gif’);
//从header信息里面分析出sessionid
preg_match(‘/JSESSIONID=([\w]+);/’, $snoopy->headers[2],$sessionid);
$jsessionid=$sessionid[1];
$imgcode=base64_encode($snoopy->results);
//显示登陆表单
?>
<form action=”” method=”post”>
<table>
<tr>
<th>用户名</th>
<td><input name=”username”></td>
</tr>
<tr>
<th>密码</th>
<td><input name=”password”></td>
</tr>
<tr>
<th>验证码</th>
<td><input name=”loginValidateCode”>
<img alt=”” src=”data:image/gif;base64,<?php echo $imgcode?>”>
</td>
</tr>
<tr>
<td><input type=”submit”></td>
</tr>
</table>
<input type=”hidden” name=”jsessionid” value=”<?php echo $jsessionid?>”>
</form>

提交表单信息到A站并显示登陆后页面:

$snoopy->cookies[‘JSESSIONID’]=post(‘jsessionid’);
$snoopy->submit(‘http://www.a.com/signin.html’,$_POST);
echo $snoopy->results;

小技巧总结:
可以对获取的图片二进制码通过base64编码直接用在img的src属性
<img alt=”” src=”data:image/gif;base64,<?php echo $base64code?>”>

 

 

 

 

//—-

Snoopy PHP网页抓取工具

snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
下面是它的一些特征:
1、方便抓取网页的内容
2、方便抓取网页的文字(去掉HTML代码)
3、方便抓取网页的链接
4、支持代理主机
5、支持基本的用户/密码认证模式
6、支持自定义用户agent,referer,cookies和header内容
7、支持浏览器转向,并能控制转向深度
8、能把网页中的链接扩展成高质量的url(默认)
9、方便提交数据并且获取返回值
10、支持跟踪HTML框架(v0.92增加)
11、支持再转向的时候传递cookies
12、支持sock
类属性: (缺省值在括号里)
$host 连接的主机
$port 连接的端口
$proxy_host 使用的代理主机,如果有的话
$proxy_port 使用的代理主机端口,如果有的话
$agent 用户代理伪装 (Snoopy v0.1)
$referer 来路信息,如果有的话
$cookies cookies, 如果有的话
$rawheaders 其他的头信息, 如果有的话
$maxredirs 最大重定向次数, 0=不允许 (5)
$offsiteok whether or not to allow redirects off-site. (true)
$expandlinks          是否将链接都补全为完整地址 (true)
$user 认证用户名, 如果有的话
$pass 认证用户名, 如果有的话
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
$error 哪里报错, 如果有的话
$response_code 从服务器返回的响应代码
$headers 从服务器返回的头信息
$maxlength 最长返回数据长度
$read_timeout 读取操作超时 (requires PHP 4 Beta 4+)
设置为0为没有超时
$timed_out 如果一次读取操作超时了,本属性返回 true (requires PHP 4 Beta 4+)
$maxframes 允许追踪的框架最大数量
$status 抓取的http的状态
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp)
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false
类方法:
fetch($URI)
———–
这是为了抓取网页的内容而使用的方法。
$URI参数是被抓取网页的URL地址。
抓取的结果被存储在 $this->results 中。
如果你正在抓取的是一个框架,Snoopy将会将每个框架追踪后存入数组中,然后存入 $this->results。

fetchtext($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中的文字内容。

fetchform($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中表单内容(form)。

fetchlinks($URI)
—————-
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

submit($URI,$formvars)
———————-
本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。

submittext($URI,$formvars)
————————–
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。

submitlinks($URI)
—————-
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

例子:
<?php
include “Snoopy.class.php”;
$url = “http://www.re1d.com/”;
$snoopy = new Snoopy;
$snoopy->fetchtext($url);//抓取内容(去掉html代码)
#$snoopy->fetchlinks($url);//抓取链接
#$snoopy->fetchform($url); //获取表单
print_r($snoopy->results);打出结果

/******************************表单提交****************************/
$submit_url = “http://www.baidu.com/index.php”;//提交页面
$formvars[“wd”] = “QQ:26818750”;//搜索的词
$snoopy->submit($submit_url,$formvars);
print_r($snoopy->results);//获取表单提交后的 返回的结果
# $snoopy->submittext; //提交后只返回 去除html的 文本
# $snoopy->submitlinks;//提交后只返回 链接

/******************************来伪装ip,伪装浏览器****************************/
$formvars[“username”] = “admin”;
$formvars[“pwd”] = “admin”;
$action = “http://www.taoav.com”; //提交页面
$snoopy->cookies[“PHPSESSID”] = ‘fc106b1918bd522cc863f36890e6fff7’; //伪装sessionid
$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”; //伪装浏览器
$snoopy->referer = http://www.re1d.com; //伪装来源页地址 http_referer
$snoopy->rawheaders[“Pragma”] = “no-cache”; //cache 的http头信息
$snoopy->rawheaders[“X_FORWARDED_FOR”] = “127.0.0.101”; //伪装ip
$snoopy->submit($action,$formvars);
echo $snoopy->results;

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。
例如 带验证码,验证ip 投票, 可以不停的投。
ps:这里伪装ip ,其实是伪装http头, 所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,
反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。
关于如何验证码 ,简单说下:
首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,
同时记下sessionid和验证码值,
接下来就用snoopy去伪造 。
原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。
有时我们可能需要伪造更多的东西,snoopy完全为我们想到了

$snoopy->proxy_host = “www.re1d.com”;
$snoopy->proxy_port = “8080”; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif ;
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息

例子: 抓取一个页面并显示他的头信息和页面内容 (去掉HTML标签的页面):

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “response code: “.$snoopy->response_code.”<br>\n”;
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 提交一个表单并且打印出头信息和去掉HTML标签的页面:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$submit_url = “http://lnk.ispi.net/texis/scripts/msearch/netsearch.html”;

$submit_vars[“q”] = “amiga”;
$submit_vars[“submit”] = “Search!”;
$submit_vars[“searchhost”] = “Altavista”;

if($snoopy->submit($submit_url,$submit_vars))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 展示所有属性的功能:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->proxy_host = “my.proxy.host”;
$snoopy->proxy_port = “8080”;

$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”;
$snoopy->referer = “http://www.microsnot.com/”;

$snoopy->cookies[“SessionID”] = 238472834723489l;
$snoopy->cookies[“favoriteColor”] = “RED”;

$snoopy->rawheaders[“Pragma”] = “no-cache”;

$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetchtext(“http://www.re1d.com”))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 抓取框架内容并展示结果:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->maxframes = 5;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “<PRE>”.htmlspecialchars($snoopy->results[0]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[1]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[2]).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

PHP批量检查网站的sitemap是否存在

<?php
$webfile = "sitexml.txt";
$opensite = fopen($webfile, 'r');

function curl($url) {
    /*
    * 测试用的浏览器信息
    *

    */
    $browsers = array (

        "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
        "language" => "en-us,en;q=0.5"
    );
    $ch = curl_init();
    // 设置 url
    curl_setopt($ch, CURLOPT_URL, $url);
    // 设置浏览器的特定header
    //CURLOPT_HTTPHEADER: An array of HTTP header fields to set.
    //curl_setopt($ch, CURLOPT_HTTPHEADER, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array (
        "User-Agent: {$browsers['user_agent']}",
        "Accept-Language: {$browsers['language']}"
    ));

    // 页面内容我们并不需要
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    // 只需返回HTTP header
    curl_setopt($ch, CURLOPT_HEADER, 1);
    // 返回结果,而不是输出它
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //执行curl操作
    //return (curl_exec($ch)!==false) ? true : false;
    $output = curl_exec($ch);
    return $output;
    curl_close($ch);
}
while (!feof($opensite)) {
    $onesite = fgets($opensite, 4096);
    $onesite = str_replace("\n", "", $onesite);
    $url = $onesite . "/sitemap.xml";
    if (!empty ($onesite)) {

        echo "[URL]: $url<br>";
        echo curl($url);

        if (curl($url) == false) {
            echo '<FONT color=#ff0000>' . "网站不能打开" . '</font>' . "<br>";

        }
        preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
        //print_r($http_status);
        if ($http_status[1] == 200) {
            echo $url . "存在sitemap" . "<br>";
        }
        if ($http_status[1] == 301) {
            $url = 'www.' . $url;
            preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
            if ($http_status[1] == 200) {
                echo $url . "存在sitemap" . "<br>";
            } else {
                echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';
            }
        }
        if ($http_status[1] == (404|400|403|500|501|502|503|504|505)) {
            echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';

        }

        echo "<br><br>";
    }
}
?>

 

RAR保存到JPG之中

copy/b d:xxx.jpg+d:xxx.rar d:xxx.jpg

这个xxx.rar可以放很多东西

将图片下载以后将图片后缀 jpg 改为 rar然后 双击即可打开

一个获取APK的packagename,versionCode,versionName

因为应用经常我这里分析包名,所以写了此bat

使用方法,另存下面的内容为xxx.bat,然后把apk直接拖到此bat上,就会把信息直接赋值到剪切板,直接粘贴就是了

ps:需要android环境支持

 

@echo off
title 获取包名
echo 获取包名
aapt d badging %1 >>qq.txt
findstr "\<package: name=\'*\'\>" qq.txt >>qq2.txt
del qq.txt
CLIP < qq2.txt
del qq2.txt
echo 结束!
#pause
exit

 

自动修改android模拟器的imei的小程序

该程序实现一下功能,

1,修改android模拟器的imei,

2,自动启动android模拟器

3,运行开机启动程序,ps:这个开机启动程序apk就没放出来了。

4,停止android模拟器;

重复1,2,3过程

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
     while(true){//
         eidtEmulator();//修改imei

         Runtime rt = Runtime.getRuntime();  
         String command = "C:\\Program Files\\Android\\android-sdk\\tools\\emulator -avd AVD-10";    
         rt.exec(command);  // 运行android模拟器
         System.out.println("success run");
         Thread.sleep(2*60*1000);//  等待2分钟后,停止android模拟器
         if(findRunningWindowsProcess("emulator-arm.exe")){
               killRunningWindowsProcess("emulator-arm.exe");
        }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }  
 }

 public static void eidtEmulator() throws Exception{
     String oldFilePath = "C:\\Program Files\\Android\\android-sdk\\tools\\emulator-arm.exe ";
     String newFilePath = "C:\\Program Files\\Android\\android-sdk\\tools\\emulator-arm1.exe";
     FileInputStream in = new FileInputStream(oldFilePath);
     FileOutputStream out = new FileOutputStream(newFilePath);
     byte bytes[] = new byte[1];
     byte gsnbytes[] = new byte[3];
     byte imeiBytes[] = new byte[15];
     int count;
     while ((count = in.read(bytes)) != -1) {
           out.write(bytes);
           if (bytes[0] == 0x43) {// if is char 'C'
                    count = in.read(gsnbytes);
                    if (count == -1) {
                         break;
                    }
                    out.write(gsnbytes);
                    if (gsnbytes[0] == 0x47 && gsnbytes[1] == 0x53 && gsnbytes[2] == 0x4E) {//if is char 'GSN'
                         count = in.read(bytes);//read char '.'
                         if (count == -1) {
                                break;
                          }
                          out.write(bytes);
                          count = in.read(imeiBytes);//read old imei
                         if (count == -1) {
                                 break;
                          }
                          byte[] imeis = getIMEIBytes();
                          out.write(imeis);//write new imei;
                     }
               }
        }
  in.close();
  out.close();
  File oldFile = new File(oldFilePath);
  oldFile.delete();
  File newFile = new File(newFilePath);
  newFile.renameTo(oldFile);

 }

 public static byte[] getIMEIBytes() {//随即生成15位imei号
       StringBuffer bff = new StringBuffer();
       byte imeiBytes[] = new byte[15];
       for(int i=0;i<imeiBytes.length;i++){
                int num = (int) Math.round(Math.random()*8);
                bff.append(num);
                imeiBytes[i] = Byte.parseByte("3"+num, 16);
         }
      //  printArray(imeiBytes);
       System.err.println("start imei: "+bff.toString());
       return imeiBytes;
 }

 public static void printArray(byte bytes[]) {
  StringBuffer buff = new StringBuffer();
  for (byte b : bytes) {
   buff.append(String.format("%02X", b) + " ");
  }
   System.out.println(buff.toString());
 }

 public static boolean killRunningWindowsProcess(String processName){   
        try {   
            Runtime.getRuntime().exec("taskkill /IM " + processName);   
            System.out.println("kill process successful");   
//            System.out.println("Process " + processName + " was killed. Mission completed.");   
            return true;   
        } catch (Exception ex) {   
            ex.printStackTrace();   
            System.out.println("kill process fail");   
            System.out.println("Misson failed.");   
            return false;   
        }   
    }   
 public static boolean findRunningWindowsProcess(String processName) {   
        BufferedReader bufferedReader = null;   
        Process proc = null;   
        try {   
            proc = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq " + processName + "\"");   
            bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));   
            String line;   
            while ((line = bufferedReader.readLine()) != null) {   
                if (line.contains(processName)) {   
                    return true;   
                }   
            }   
            return false;   
        } catch (Exception ex) {   
            ex.printStackTrace();   
            return false;   
        } finally {   
            if (bufferedReader != null) {   
                try {   
                    bufferedReader.close();   
                } catch (Exception ex) {   
                }   
            }   
            if (proc != null) {   
                try {   
                    proc.destroy();   
                } catch (Exception ex) {   
                }   
            }   
        }   
    }  
}