面对这个问题的原因其实很简单,游戏项目,服务器采用C++开发,用户数据以二进制数据保存在mysql中,对应数据类型为Blob。
现在,公司想要通过web查看到这些玩家的数据,顾,需要读取mysql,玩家的二进制数据包,进行拆分,这样不仅面对Java对Blob数据的处理,还要进行Java与C++数据的转换。
公有类:
package cn.vicky.utils;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
/**
* 仅仅适用于 Java 与 C++ 通讯中,网络流解析与生成使用
*
* 高低位互换(Big-Endian 大头在前 & Little-Endian 小头在前)。
* 举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号0˜3字节的位置,两种字节序的排列方式分别如下:
* <pre>
* Big Endian
*
* 低地址 高地址
* ----------------------------------------------------+
* 地址编号
* | 0 | 1 | 2 | 3 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | 01 | 02 | 03 | 04 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* Little Endian
*
* 低地址 高地址
* ----------------------------------------------------+
* 地址编号
* | 0 | 1 | 2 | 3 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | 04 | 03 | 02 | 01 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* </pre>
* Java则统一使用big模式
* c中的unsigned short 对应着java中的char两个字节,无符号
* c的无符号int,short,byte字节数组,相应转换成java的long,char,short
*
* @author Snowolf
* @version 1.0
* @since 1.0
*/
public abstract class CIOUtil {
public static final String CHARSET = "UTF-8";
/**
* 从输入流中读布尔
*
* @param is
* @return
* @throws IOException
*/
public static boolean readBoolean(DataInputStream is) throws IOException {
return is.readBoolean();
}
/**
* 从流中读定长度字节数组
*
* @param is
* @param s
* @return
* @throws IOException
*/
public static byte[] readBytes(DataInputStream is, int i)
throws IOException {
byte[] data = new byte[i];
is.readFully(data);
return data;
}
/**
* 从输入流中读字符
*
* @param is
* @return
* @throws IOException
*/
public static char readChar(DataInputStream is) throws IOException {
return (char) readShort(is);
}
/**
* 从输入流中读双精度
*
* @param is
* @return
* @throws IOException
*/
public static double readDouble(DataInputStream is) throws IOException {
return Double.longBitsToDouble(readLong(is));
}
/**
* 从输入流中读单精度
*
* @param is
* @return
* @throws IOException
*/
public static float readFloat(DataInputStream is) throws IOException {
return Float.intBitsToFloat(readInt(is));
}
/**
* 从流中读整型
*
* @param is
* @return
* @throws IOException
*/
public static int readInt(DataInputStream is) throws IOException {
return Integer.reverseBytes(is.readInt());
}
/**
* 从流中读长整型
*
* @param is
* @return
* @throws IOException
*/
public static long readLong(DataInputStream is) throws IOException {
return Long.reverseBytes(is.readLong());
}
/**
* 从流中读短整型
*
* @param is
* @return
* @throws IOException
*/
public static short readShort(DataInputStream is) throws IOException {
return Short.reverseBytes(is.readShort());
}
/**
* 从输入流中读字符串 字符串 结构 为 一个指定字符串字节长度的短整型+实际字符串
*
* @param is
* @return
* @throws IOException
*/
public static String readUTF(DataInputStream is) throws IOException {
short s = readShort(is);
byte[] str = new byte[s];
is.readFully(str);
return new String(str, CHARSET);
}
/**
* 向输出流中写布尔
*
* @param os
* @param b
* @throws IOException
*/
public static void writeBoolean(DataOutputStream os, boolean b)
throws IOException {
os.writeBoolean(b);
}
/**
* 向输出流中写字节数组
*
* @param os
* @param data
* @throws IOException
*/
public static void writeBytes(DataOutputStream os, byte[] data)
throws IOException {
os.write(data);
}
/**
* 向输出流中写字符
*
* @param os
* @param b
* @throws IOException
*/
public static void writeChar(DataOutputStream os, char b)
throws IOException {
writeShort(os, (short) b);
}
/**
* 向输出流中写双精度
*
* @param os
* @param d
* @throws IOException
*/
public static void writeDouble(DataOutputStream os, double d)
throws IOException {
writeLong(os, Double.doubleToLongBits(d));
}
/**
* 向输出流中写单精度
*
* @param os
* @param f
* @throws IOException
*/
public static void writeFloat(DataOutputStream os, float f)
throws IOException {
writeInt(os, Float.floatToIntBits(f));
}
/**
* 向输出流中写整型
*
* @param os
* @param i
* @throws IOException
*/
public static void writeInt(DataOutputStream os, int i) throws IOException {
os.writeInt(Integer.reverseBytes(i));
}
/**
* 向输出流中写长整型
*
* @param os
* @param l
* @throws IOException
*/
public static void writeLong(DataOutputStream os, long l)
throws IOException {
os.writeLong(Long.reverseBytes(l));
}
/**
* 向输出流中写短整型
*
* @param os
* @param s
* @throws IOException
*/
public static void writeShort(DataOutputStream os, short s)
throws IOException {
os.writeShort(Short.reverseBytes(s));
}
/**
* 向输出流中写字符串 字符串 结构 为 一个指定字符串字节长度的短整型+实际字符串
*
* @param os
* @param str
* @throws IOException
*/
public static void writeUTF(DataOutputStream os, String str)
throws IOException {
byte[] data = str.getBytes(CHARSET);
writeShort(os, (short) data.length);
os.write(data);
}
}
测试类,读取mysql的blob数据,进行处理。
package cn.vicky.blob;
import cn.vicky.dao.DB;
import cn.vicky.dao.DBImpl;
import cn.vicky.utils.CIOUtil;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Vicky.H
*/
public class BlobData {
public static void main(String[] args) {
DB db = new DBImpl("192.168.1.96", 3306, "solokingrole", "root", "123456");
String sql = "select * from roledata where roleid = 2";
db.getCon();
db.doPstm(sql);
try {
ResultSet set = db.getRs();
while (set.next()) {
System.out.println(set.getObject(1));
System.out.println(set.getObject(2));
Blob blob = set.getBlob(3);
System.out.println(blob);
InputStream is = blob.getBinaryStream();
DataInputStream dis = new DataInputStream(is);
try {
// Player.h struct stPlayerContexts
System.out.println("版本号 : " + CIOUtil.readShort(dis)); // stPlayerContext.nMainVision
// stPlayerContext struct stPROPERTY playerProperty 人物属性表
System.out.println("最大血量 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nMaxHp
System.out.println("当前血量 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nHp
System.out.println("最大魔法值 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nMaxEp
System.out.println("当前魔法值 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nEp
System.out.println("攻击力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nAtk
System.out.println("火焰攻击力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nFireAtk
System.out.println("冰霜攻击力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nIceAtk
System.out.println("物理防御力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPhyDef
System.out.println("魔法防御力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nMgcDef
System.out.println("命中 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nHit
System.out.println("暴击 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nCritRate
System.out.println("暴击伤害 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreCritDmg
System.out.println("闪避 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nMissRate
System.out.println("抗暴能力 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nMisCritRate
System.out.println("当前经验 : " + CIOUtil.readInt(dis)); // stPlayerContext.playerProperty.nExp
System.out.println("最大经验 : " + CIOUtil.readInt(dis)); // stPlayerContext.playerProperty.nMaxExp
System.out.println("火耐 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreFireRestrain
System.out.println("冰耐 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreIceRestrain
System.out.println("异耐 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreNegRestrain
System.out.println("物理免疫 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPhyImanity
System.out.println("疲劳度 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.playerProperty.nTired
System.out.println("经验倍率 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreExpTimes
System.out.println("nSuckRate : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nSuckRate
System.out.println("nSuckhpNum : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nSuckhpNum
System.out.println("nPreSuckHp : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nPreSuckHp
System.out.println("nSuckAp : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nSuckAp
System.out.println("nSuckSp : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nSuckSp
System.out.println("nSuckMp : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nSuckMp
System.out.println("nCurse : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nCurse
System.out.println("攻击速度 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nAtkSpeed
System.out.println("移动速度 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.playerProperty.byMoveSpeed
System.out.println("声望值 : " + CIOUtil.readInt(dis)); // stPlayerContext.playerProperty.nPrestige
System.out.println("罪恶值 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nEvil
System.out.println("战场疲劳度 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.playerProperty.nArenaTire
System.out.println("雷属性 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nThunder
System.out.println("雷抗性 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nThunderRestrain
System.out.println("预留1 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[0]
System.out.println("预留2 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[1]
System.out.println("预留3 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[2]
System.out.println("预留4 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[3]
System.out.println("预留5 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[4]
System.out.println("预留6 : " + CIOUtil.readShort(dis)); // stPlayerContext.playerProperty.nReserve[5]
// stPlayerContext struct stPlayerSkill sPlayerSkill 人物技能表
System.out.println("技能个数 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.sPlayerSkill.nSkillNum
System.out.println("总共技能点 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.sPlayerSkill.byTotalSkillPoint
System.out.println("剩余技能点 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.sPlayerSkill.byRemainPoint
// stPlayerContext.sPlayerSkill.sSkill 技能结构
for (int i = 1; i < 31; i++) {
System.out.println("技能结构["+i+"].技能id : " + CIOUtil.readShort(dis)); // stPlayerContext.sPlayerSkill.sSkill.nSkill
System.out.println("技能结构["+i+"].剩余cd时间 : " + CIOUtil.readInt(dis)); // stPlayerContext.sPlayerSkill.sSkill.nCoolDownTime
System.out.println("技能结构["+i+"].剩余cd时间 : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.sPlayerSkill.sSkill.nCoolDownTime
}
// stPlayerContext.sPlayerSkill.sEffect buff结构
for (int i = 1; i < 11; i++) {
System.out.println("buff结构["+i+"].nEffectId : " + CIOUtil.readInt(dis)); // stPlayerContext.sPlayerSkill.sEffect.nEffectId
for (int j = 1; j < 6; j++) {
System.out.println("buff结构["+i+"]["+j+"].nCycTime : " + CIOUtil.readInt(dis)); // stPlayerContext.sPlayerSkill.sEffect.nCycTime
System.out.println("buff结构["+i+"]["+j+"].byEffectType : " + CIOUtil.readBytes(dis,1)[0]); // stPlayerContext.sPlayerSkill.sEffect.byEffectType
System.out.println("buff结构["+i+"]["+j+"].nNum : " + CIOUtil.readShort(dis)); // stPlayerContext.sPlayerSkill.sEffect.nNum
}
}
// stPlayerItems
// stPlayerItems.stItems
for (int i = 1; i < 61; i++) {
}
} catch (IOException ex) {
Logger.getLogger(BlobData.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
dis.close();
is.close();
} catch (IOException ex) {
Logger.getLogger(BlobData.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
} catch (SQLException ex) {
Logger.getLogger(BlobData.class.getName()).log(Level.SEVERE, null, ex);
} finally {
db.close();
}
}
}
输出结果:
run:
select * from roledata where roleid = 2
2
0
com.mysql.jdbc.Blob@e2eec8
版本号 : 1000
最大血量 : 140
当前血量 : 140
最大魔法值 : 100
当前魔法值 : 100
攻击力 : 24
火焰攻击力 : 0
冰霜攻击力 : 0
物理防御力 : 26
魔法防御力 : 20
命中 : 9300
暴击 : 300
暴击伤害 : 15000
闪避 : 300
抗暴能力 : 0
当前经验 : 0
最大经验 : 9
火耐 : 0
冰耐 : 0
异耐 : 0
物理免疫 : 0
疲劳度 : 100
经验倍率 : 0
nSuckRate : 0
nSuckhpNum : 0
nPreSuckHp : 0
nSuckAp : 0
nSuckSp : 0
nSuckMp : 0
nCurse : 0
攻击速度 : 1000
移动速度 : 60
声望值 : 0
罪恶值 : 0
战场疲劳度 : 100
雷属性 : 0
雷抗性 : 0
预留1 : 0
预留2 : 0
预留3 : 0
预留4 : 0
预留5 : 0
预留6 : 0
技能个数 : 0
总共技能点 : 0
剩余技能点 : 0
技能结构[1].技能id : 0
技能结构[1].剩余cd时间 : 256
技能结构[1].剩余cd时间 : -119
技能结构[2].技能id : 19
技能结构[2].剩余cd时间 : 16777216
技能结构[2].剩余cd时间 : 0
技能结构[3].技能id : 0
技能结构[3].剩余cd时间 : 0
技能结构[3].剩余cd时间 : 0
技能结构[4].技能id : 0
技能结构[4].剩余cd时间 : 0
技能结构[4].剩余cd时间 : 0
技能结构[5].技能id : 0
技能结构[5].剩余cd时间 : 0
技能结构[5].剩余cd时间 : 0
技能结构[6].技能id : 0
技能结构[6].剩余cd时间 : 0
技能结构[6].剩余cd时间 : 0
技能结构[7].技能id : 0
技能结构[7].剩余cd时间 : 0
技能结构[7].剩余cd时间 : 0
技能结构[8].技能id : 0
技能结构[8].剩余cd时间 : 0
技能结构[8].剩余cd时间 : 0
技能结构[9].技能id : 0
技能结构[9].剩余cd时间 : 0
技能结构[9].剩余cd时间 : 0
技能结构[10].技能id : 0
技能结构[10].剩余cd时间 : 0
技能结构[10].剩余cd时间 : 0
技能结构[11].技能id : 0
技能结构[11].剩余cd时间 : 0
技能结构[11].剩余cd时间 : 0
技能结构[12].技能id : 0
技能结构[12].剩余cd时间 : 0
技能结构[12].剩余cd时间 : 0
技能结构[13].技能id : 0
技能结构[13].剩余cd时间 : 0
技能结构[13].剩余cd时间 : 0
技能结构[14].技能id : 0
技能结构[14].剩余cd时间 : 0
技能结构[14].剩余cd时间 : 0
技能结构[15].技能id : 0
技能结构[15].剩余cd时间 : 0
技能结构[15].剩余cd时间 : 0
技能结构[16].技能id : 0
技能结构[16].剩余cd时间 : 0
技能结构[16].剩余cd时间 : 0
技能结构[17].技能id : 0
技能结构[17].剩余cd时间 : 0
技能结构[17].剩余cd时间 : 0
技能结构[18].技能id : 0
技能结构[18].剩余cd时间 : 0
技能结构[18].剩余cd时间 : 0
技能结构[19].技能id : 0
技能结构[19].剩余cd时间 : 0
技能结构[19].剩余cd时间 : 0
技能结构[20].技能id : 0
技能结构[20].剩余cd时间 : 0
技能结构[20].剩余cd时间 : 0
技能结构[21].技能id : 0
技能结构[21].剩余cd时间 : 0
技能结构[21].剩余cd时间 : 0
技能结构[22].技能id : 0
技能结构[22].剩余cd时间 : 0
技能结构[22].剩余cd时间 : 0
技能结构[23].技能id : 0
技能结构[23].剩余cd时间 : 0
技能结构[23].剩余cd时间 : 0
技能结构[24].技能id : 0
技能结构[24].剩余cd时间 : 0
技能结构[24].剩余cd时间 : 0
技能结构[25].技能id : 0
技能结构[25].剩余cd时间 : 0
技能结构[25].剩余cd时间 : 0
技能结构[26].技能id : 0
技能结构[26].剩余cd时间 : 0
技能结构[26].剩余cd时间 : 0
技能结构[27].技能id : 0
技能结构[27].剩余cd时间 : 0
技能结构[27].剩余cd时间 : 0
技能结构[28].技能id : 0
技能结构[28].剩余cd时间 : 0
技能结构[28].剩余cd时间 : 0
技能结构[29].技能id : 0
技能结构[29].剩余cd时间 : 0
技能结构[29].剩余cd时间 : 0
技能结构[30].技能id : 0
技能结构[30].剩余cd时间 : 0
技能结构[30].剩余cd时间 : 0
buff结构[1].nEffectId : 0
buff结构[1][1].nCycTime : 0
buff结构[1][1].byEffectType : 0
buff结构[1][1].nNum : 0
buff结构[1][2].nCycTime : 0
buff结构[1][2].byEffectType : 0
buff结构[1][2].nNum : 0
buff结构[1][3].nCycTime : 0
buff结构[1][3].byEffectType : 0
buff结构[1][3].nNum : 0
buff结构[1][4].nCycTime : 0
buff结构[1][4].byEffectType : 0
buff结构[1][4].nNum : 0
buff结构[1][5].nCycTime : 0
buff结构[1][5].byEffectType : 0
buff结构[1][5].nNum : 0
buff结构[2].nEffectId : 0
buff结构[2][1].nCycTime : 0
buff结构[2][1].byEffectType : 0
buff结构[2][1].nNum : 0
buff结构[2][2].nCycTime : 0
buff结构[2][2].byEffectType : 0
buff结构[2][2].nNum : 0
buff结构[2][3].nCycTime : 0
buff结构[2][3].byEffectType : 0
buff结构[2][3].nNum : 0
buff结构[2][4].nCycTime : 0
buff结构[2][4].byEffectType : 0
buff结构[2][4].nNum : 0
buff结构[2][5].nCycTime : 0
buff结构[2][5].byEffectType : 0
buff结构[2][5].nNum : 0
buff结构[3].nEffectId : 0
buff结构[3][1].nCycTime : 0
buff结构[3][1].byEffectType : 0
buff结构[3][1].nNum : 0
buff结构[3][2].nCycTime : 0
buff结构[3][2].byEffectType : 0
buff结构[3][2].nNum : 0
buff结构[3][3].nCycTime : 0
buff结构[3][3].byEffectType : 0
buff结构[3][3].nNum : 0
buff结构[3][4].nCycTime : 0
buff结构[3][4].byEffectType : 0
buff结构[3][4].nNum : 0
buff结构[3][5].nCycTime : 0
buff结构[3][5].byEffectType : 0
buff结构[3][5].nNum : 0
buff结构[4].nEffectId : 0
buff结构[4][1].nCycTime : 0
buff结构[4][1].byEffectType : 0
buff结构[4][1].nNum : 0
buff结构[4][2].nCycTime : 0
buff结构[4][2].byEffectType : 0
buff结构[4][2].nNum : 0
buff结构[4][3].nCycTime : 0
buff结构[4][3].byEffectType : 0
buff结构[4][3].nNum : 0
buff结构[4][4].nCycTime : 0
buff结构[4][4].byEffectType : 0
buff结构[4][4].nNum : 0
buff结构[4][5].nCycTime : 0
buff结构[4][5].byEffectType : 0
buff结构[4][5].nNum : 0
buff结构[5].nEffectId : 0
buff结构[5][1].nCycTime : 0
buff结构[5][1].byEffectType : 0
buff结构[5][1].nNum : 0
buff结构[5][2].nCycTime : 0
buff结构[5][2].byEffectType : 0
buff结构[5][2].nNum : 0
buff结构[5][3].nCycTime : 0
buff结构[5][3].byEffectType : 0
buff结构[5][3].nNum : 0
buff结构[5][4].nCycTime : 0
buff结构[5][4].byEffectType : 0
buff结构[5][4].nNum : 0
buff结构[5][5].nCycTime : 0
buff结构[5][5].byEffectType : 0
buff结构[5][5].nNum : 0
buff结构[6].nEffectId : 0
buff结构[6][1].nCycTime : 0
buff结构[6][1].byEffectType : 0
buff结构[6][1].nNum : 0
buff结构[6][2].nCycTime : 0
buff结构[6][2].byEffectType : 0
buff结构[6][2].nNum : 0
buff结构[6][3].nCycTime : 0
buff结构[6][3].byEffectType : 0
buff结构[6][3].nNum : 0
buff结构[6][4].nCycTime : 0
buff结构[6][4].byEffectType : 0
buff结构[6][4].nNum : 0
buff结构[6][5].nCycTime : 0
buff结构[6][5].byEffectType : 0
buff结构[6][5].nNum : 0
buff结构[7].nEffectId : 0
buff结构[7][1].nCycTime : 0
buff结构[7][1].byEffectType : 0
buff结构[7][1].nNum : 0
buff结构[7][2].nCycTime : 0
buff结构[7][2].byEffectType : 0
buff结构[7][2].nNum : 0
buff结构[7][3].nCycTime : 0
buff结构[7][3].byEffectType : 4
buff结构[7][3].nNum : -512
buff结构[7][4].nCycTime : -888927745
buff结构[7][4].byEffectType : 78
buff结构[7][4].nNum : 216
buff结构[7][5].nCycTime : 0
buff结构[7][5].byEffectType : 0
buff结构[7][5].nNum : 16640
buff结构[8].nEffectId : 65542
buff结构[8][1].nCycTime : 0
buff结构[8][1].byEffectType : 0
buff结构[8][1].nNum : 0
buff结构[8][2].nCycTime : 0
buff结构[8][2].byEffectType : 0
buff结构[8][2].nNum : 0
buff结构[8][3].nCycTime : 0
buff结构[8][3].byEffectType : 0
buff结构[8][3].nNum : 0
buff结构[8][4].nCycTime : 0
buff结构[8][4].byEffectType : 0
buff结构[8][4].nNum : 0
buff结构[8][5].nCycTime : 0
buff结构[8][5].byEffectType : 0
buff结构[8][5].nNum : 0
buff结构[9].nEffectId : 0
buff结构[9][1].nCycTime : 0
buff结构[9][1].byEffectType : 0
buff结构[9][1].nNum : 0
buff结构[9][2].nCycTime : 0
buff结构[9][2].byEffectType : 0
buff结构[9][2].nNum : 0
buff结构[9][3].nCycTime : 0
buff结构[9][3].byEffectType : 0
buff结构[9][3].nNum : 0
buff结构[9][4].nCycTime : 0
buff结构[9][4].byEffectType : 0
buff结构[9][4].nNum : 0
buff结构[9][5].nCycTime : 0
buff结构[9][5].byEffectType : 0
buff结构[9][5].nNum : 0
buff结构[10].nEffectId : 0
buff结构[10][1].nCycTime : 0
buff结构[10][1].byEffectType : 0
buff结构[10][1].nNum : 0
buff结构[10][2].nCycTime : 0
buff结构[10][2].byEffectType : 0
buff结构[10][2].nNum : 0
buff结构[10][3].nCycTime : 0
buff结构[10][3].byEffectType : 0
buff结构[10][3].nNum : 0
buff结构[10][4].nCycTime : 0
buff结构[10][4].byEffectType : 0
buff结构[10][4].nNum : 0
buff结构[10][5].nCycTime : 0
buff结构[10][5].byEffectType : 0
buff结构[10][5].nNum : 0
成功生成(总时间:7 秒)