private final byte[] blowfishKey;
/**
* <b>Конструктор</b><br>
* <small>Выполняет действия при создании нового экземпляра класса.</small>
* @param blowfishKey blowfish ключ.
*/
public GameCrypt(byte[] blowfishKey) {
this.blowfishKey = blowfishKey;
}
private final byte[] blowfishKey = new byte[16];
/**
* <b>Конструктор</b><br>
* <small>Выполняет...
Варианты из головы:Пакет принимаю так:
name = readString();
race = (byte) readInt();
sex = (byte) readInt();
baseClass = (byte) readInt();
readInt();
readInt();
readInt();
readInt();
readInt();
readInt();
hairStyle = (byte) readInt();
hairColor = (byte) readInt();
face = (byte) readInt();
try(LineNumberReader lnr = new LineNumberReader(new BufferedReader(new FileReader(file))))
сьедало какие-то символы, byte[] array = Files.readAllBytes(file.toPath());
final String values = new String(array, StandardCharsets.UTF_8);
return Arrays.asList(values.split("\n"));
protected String readString() {
char ch;
final StringBuilder string = new StringBuilder();
while((ch = byteBuffer.getChar()) != 0) {
string.append(ch);
}
return string.toString();
}
package ru.catssoftware.gameserver.network.clientpackets;
import ru.catssoftware.Config;
import ru.catssoftware.gameserver.datatables.CharNameTable;
import ru.catssoftware.gameserver.datatables.CharTemplateTable;
import ru.catssoftware.gameserver.datatables.ItemTable;
import ru.catssoftware.gameserver.datatables.SkillTable;
import ru.catssoftware.gameserver.datatables.SkillTreeTable;
import ru.catssoftware.gameserver.idfactory.IdFactory;
import ru.catssoftware.gameserver.instancemanager.QuestManager;
import ru.catssoftware.gameserver.model.L2ItemInstance;
import ru.catssoftware.gameserver.model.L2ShortCut;
import ru.catssoftware.gameserver.model.L2SkillLearn;
import ru.catssoftware.gameserver.model.L2World;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PlayableInstance;
import ru.catssoftware.gameserver.model.base.Experience;
import ru.catssoftware.gameserver.model.itemcontainer.PcInventory;
import ru.catssoftware.gameserver.model.quest.Quest;
import ru.catssoftware.gameserver.model.quest.QuestState;
import ru.catssoftware.gameserver.network.Disconnection;
import ru.catssoftware.gameserver.network.L2GameClient;
import ru.catssoftware.gameserver.network.serverpackets.CharCreateFail;
import ru.catssoftware.gameserver.network.serverpackets.CharCreateOk;
import ru.catssoftware.gameserver.network.serverpackets.CharSelectionInfo;
import ru.catssoftware.gameserver.taskmanager.SQLQueue;
import ru.catssoftware.gameserver.templates.chars.L2PcTemplate;
import ru.catssoftware.gameserver.templates.chars.L2PcTemplate.PcTemplateItem;
@SuppressWarnings("unused")
public class CharacterCreate extends L2GameClientPacket
{
private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate";
private String _name;
private int _race, _classId, _int, _str, _con, _men, _dex, _wit;
private byte _sex, _hairStyle, _hairColor, _face;
private static final Object _lock = new Object();
@Override
protected void readImpl()
{
_name = readS();
_race = readD();
_sex = (byte) readD();
_classId = readD();
_int = readD();
_str = readD();
_con = readD();
_men = readD();
_dex = readD();
_wit = readD();
_hairStyle = (byte) readD();
_hairColor = (byte) readD();
_face = (byte) readD();
}
@Override
protected void runImpl()
{
synchronized (_lock)
{
if (CharNameTable.getInstance().doesCharNameExist(_name))
{
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS);
sendPacket(ccf);
return;
}
else if (CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT && Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0)
{
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS);
sendPacket(ccf);
return;
}
else if (!Config.CNAME_PATTERN.matcher(_name).matches())
{
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS);
sendPacket(ccf);
return;
}
L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(_classId);
if (template == null || template.getClassBaseLevel() > 1)
{
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED);
sendPacket(ccf);
return;
}
int objectId = IdFactory.getInstance().getNextId();
L2PcInstance newChar = L2PcInstance.create(objectId, template, getClient().getAccountName(),_name, _hairStyle, _hairColor, _face, _sex!=0);
newChar.getStatus().setCurrentHp(template.getBaseHpMax());
newChar.getStatus().setCurrentCp(template.getBaseCpMax());
newChar.getStatus().setCurrentMp(template.getBaseMpMax());
// send acknowledgement
CharCreateOk cco = new CharCreateOk();
sendPacket(cco);
initNewChar(getClient(), newChar);
}
}
private void initNewChar(L2GameClient client, L2PcInstance newChar)
{
L2World.getInstance().storeObject(newChar);
L2PcTemplate template = newChar.getTemplate();
if (Config.STARTING_ADENA > 0)
newChar.addAdena("Init", Config.STARTING_ADENA, null, false);
if (Config.STARTING_AA > 0)
newChar.addAncientAdena("Init", Config.STARTING_AA, null, false);
for (int[] startingItems : Config.CUSTOM_STARTER_ITEMS)
{
if (newChar == null)
{
continue;
}
PcInventory inv = newChar.getInventory();
if (ItemTable.getInstance().createDummyItem(startingItems[0]).isStackable())
{
inv.addItem("Starter Items", startingItems[0], startingItems[1], newChar, null);
}
else
{
for (int i = 0; i < startingItems[1]; i++)
{
inv.addItem("Starter Items", startingItems[0], 1, newChar, null);
}
}
}
if (Config.ALLOW_NEW_CHAR_CUSTOM_POSITION)
newChar.getPosition().setXYZInvisible(Config.NEW_CHAR_POSITION_X, Config.NEW_CHAR_POSITION_Y, Config.NEW_CHAR_POSITION_Z);
else
newChar.getPosition().setXYZInvisible(template.getSpawnX(), template.getSpawnY(), template.getSpawnZ());
if (Config.ALLOW_NEW_CHARACTER_TITLE)
newChar.setTitle(Config.NEW_CHARACTER_TITLE);
else
newChar.setTitle("");
if(Config.ENABLE_STARTUP_LVL)
{
long EXp = Experience.LEVEL[Config.ADD_LVL_NEWBIE];
newChar.addExpAndSp(EXp , 0);
}
if (Config.NEW_CHAR_IS_NOBLE)
newChar.setNoble(true);
// new char give Lucky Protection
newChar.addSkill(SkillTable.getInstance().getInfo(194, 1), true);
L2ShortCut shortcut;
//add attack shortcut
shortcut = new L2ShortCut(0, 0, 3, 2, 0, 1);
newChar.registerShortCut(shortcut);
//add take shortcut
shortcut = new L2ShortCut(3, 0, 3, 5, 0, 1);
newChar.registerShortCut(shortcut);
//add sit shortcut
shortcut = new L2ShortCut(10, 0, 3, 0, 0, 1);
newChar.registerShortCut(shortcut);
for (PcTemplateItem ia : template.getItems())
{
L2ItemInstance item = newChar.getInventory().addItem("Init", ia.getItemId(), ia.getAmount(), newChar, null);
// add tutbook shortcut
if (item.getItemId() == 5588)
{
shortcut = new L2ShortCut(11, 0, 1, item.getObjectId(), 0, 1);
newChar.registerShortCut(shortcut);
}
if (item.isEquipable() && ia.isEquipped())
newChar.getInventory().equipItemAndRecord(item);
}
for (L2SkillLearn skill: SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId()))
{
newChar.addSkill(SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel()), true);
if (skill.getId() == 1001 || skill.getId() == 1177)
{
shortcut = new L2ShortCut(1, 0, 2, skill.getId(), skill.getLevel(), 1);
newChar.registerShortCut(shortcut);
}
if (skill.getId() == 1216)
{
shortcut = new L2ShortCut(10, 0, 2, skill.getId(), skill.getLevel(), 1);
newChar.registerShortCut(shortcut);
}
}
startTutorialQuest(newChar);
startNewbieHelperQuest(newChar);
//new Disconnection(getClient(), newChar).defaultSequence(true);
newChar.store();
newChar.deleteMe();
// send char list
CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1);
client.sendPacket(cl);
client.setCharSelection(cl.getCharInfo());
}
public void startTutorialQuest(L2PcInstance player)
{
QuestState qs = player.getQuestState("255_Tutorial");
Quest q = null;
if (qs == null)
q = QuestManager.getInstance().getQuest("255_Tutorial");
if (q != null)
q.newQuestState(player);
}
public void startNewbieHelperQuest(L2PcInstance player)
{
QuestState qs = player.getQuestState("7003_NewbieHelper");
Quest q = null;
if (qs == null)
q = QuestManager.getInstance().getQuest("7003_NewbieHelper");
if (q != null)
{
q.newQuestState(player);
player.getQuestState("7003_NewbieHelper").set("cond","0");
}
qs = player.getQuestState("1201_NewbieToken");
q = null;
if (qs == null)
q = QuestManager.getInstance().getQuest("1201_NewbieToken");
if (q != null)
q.newQuestState(player);
}
@Override
public String getType()
{
return _C__0B_CHARACTERCREATE;
}
}
Ну это пример получения и обработки данного пакета, с этим у меня все отлично, дело в том, что _name = readS(); принимает белиберду, которую я скидывал ранее, то есть помимо имени скажем Admin приходит Admက, если ввожу Admins приходит AdmὩns, и что интересно, когда ввожу 3 символа, то в _face = (byte) readD(); уже приходит не 4 байта, а меньше, проверил пока-что, что точно 1 байт доходитПосмотрите как реализованы пакеты в других исходниках и сравните опкоды.
Возможно у Вас длинна запроса совсем другая.
Пакеты не менялись в обычном интерлюде, у всех одинаковое должно быть, разная реализация только с проверками.
Как пример с гитхаба:
Код:package ru.catssoftware.gameserver.network.clientpackets; import ru.catssoftware.Config; import ru.catssoftware.gameserver.datatables.CharNameTable; import ru.catssoftware.gameserver.datatables.CharTemplateTable; import ru.catssoftware.gameserver.datatables.ItemTable; import ru.catssoftware.gameserver.datatables.SkillTable; import ru.catssoftware.gameserver.datatables.SkillTreeTable; import ru.catssoftware.gameserver.idfactory.IdFactory; import ru.catssoftware.gameserver.instancemanager.QuestManager; import ru.catssoftware.gameserver.model.L2ItemInstance; import ru.catssoftware.gameserver.model.L2ShortCut; import ru.catssoftware.gameserver.model.L2SkillLearn; import ru.catssoftware.gameserver.model.L2World; import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PlayableInstance; import ru.catssoftware.gameserver.model.base.Experience; import ru.catssoftware.gameserver.model.itemcontainer.PcInventory; import ru.catssoftware.gameserver.model.quest.Quest; import ru.catssoftware.gameserver.model.quest.QuestState; import ru.catssoftware.gameserver.network.Disconnection; import ru.catssoftware.gameserver.network.L2GameClient; import ru.catssoftware.gameserver.network.serverpackets.CharCreateFail; import ru.catssoftware.gameserver.network.serverpackets.CharCreateOk; import ru.catssoftware.gameserver.network.serverpackets.CharSelectionInfo; import ru.catssoftware.gameserver.taskmanager.SQLQueue; import ru.catssoftware.gameserver.templates.chars.L2PcTemplate; import ru.catssoftware.gameserver.templates.chars.L2PcTemplate.PcTemplateItem; @SuppressWarnings("unused") public class CharacterCreate extends L2GameClientPacket { private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate"; private String _name; private int _race, _classId, _int, _str, _con, _men, _dex, _wit; private byte _sex, _hairStyle, _hairColor, _face; private static final Object _lock = new Object(); @Override protected void readImpl() { _name = readS(); _race = readD(); _sex = (byte) readD(); _classId = readD(); _int = readD(); _str = readD(); _con = readD(); _men = readD(); _dex = readD(); _wit = readD(); _hairStyle = (byte) readD(); _hairColor = (byte) readD(); _face = (byte) readD(); } @Override protected void runImpl() { synchronized (_lock) { if (CharNameTable.getInstance().doesCharNameExist(_name)) { CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS); sendPacket(ccf); return; } else if (CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT && Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0) { CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS); sendPacket(ccf); return; } else if (!Config.CNAME_PATTERN.matcher(_name).matches()) { CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS); sendPacket(ccf); return; } L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(_classId); if (template == null || template.getClassBaseLevel() > 1) { CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED); sendPacket(ccf); return; } int objectId = IdFactory.getInstance().getNextId(); L2PcInstance newChar = L2PcInstance.create(objectId, template, getClient().getAccountName(),_name, _hairStyle, _hairColor, _face, _sex!=0); newChar.getStatus().setCurrentHp(template.getBaseHpMax()); newChar.getStatus().setCurrentCp(template.getBaseCpMax()); newChar.getStatus().setCurrentMp(template.getBaseMpMax()); // send acknowledgement CharCreateOk cco = new CharCreateOk(); sendPacket(cco); initNewChar(getClient(), newChar); } } private void initNewChar(L2GameClient client, L2PcInstance newChar) { L2World.getInstance().storeObject(newChar); L2PcTemplate template = newChar.getTemplate(); if (Config.STARTING_ADENA > 0) newChar.addAdena("Init", Config.STARTING_ADENA, null, false); if (Config.STARTING_AA > 0) newChar.addAncientAdena("Init", Config.STARTING_AA, null, false); for (int[] startingItems : Config.CUSTOM_STARTER_ITEMS) { if (newChar == null) { continue; } PcInventory inv = newChar.getInventory(); if (ItemTable.getInstance().createDummyItem(startingItems[0]).isStackable()) { inv.addItem("Starter Items", startingItems[0], startingItems[1], newChar, null); } else { for (int i = 0; i < startingItems[1]; i++) { inv.addItem("Starter Items", startingItems[0], 1, newChar, null); } } } if (Config.ALLOW_NEW_CHAR_CUSTOM_POSITION) newChar.getPosition().setXYZInvisible(Config.NEW_CHAR_POSITION_X, Config.NEW_CHAR_POSITION_Y, Config.NEW_CHAR_POSITION_Z); else newChar.getPosition().setXYZInvisible(template.getSpawnX(), template.getSpawnY(), template.getSpawnZ()); if (Config.ALLOW_NEW_CHARACTER_TITLE) newChar.setTitle(Config.NEW_CHARACTER_TITLE); else newChar.setTitle(""); if(Config.ENABLE_STARTUP_LVL) { long EXp = Experience.LEVEL[Config.ADD_LVL_NEWBIE]; newChar.addExpAndSp(EXp , 0); } if (Config.NEW_CHAR_IS_NOBLE) newChar.setNoble(true); // new char give Lucky Protection newChar.addSkill(SkillTable.getInstance().getInfo(194, 1), true); L2ShortCut shortcut; //add attack shortcut shortcut = new L2ShortCut(0, 0, 3, 2, 0, 1); newChar.registerShortCut(shortcut); //add take shortcut shortcut = new L2ShortCut(3, 0, 3, 5, 0, 1); newChar.registerShortCut(shortcut); //add sit shortcut shortcut = new L2ShortCut(10, 0, 3, 0, 0, 1); newChar.registerShortCut(shortcut); for (PcTemplateItem ia : template.getItems()) { L2ItemInstance item = newChar.getInventory().addItem("Init", ia.getItemId(), ia.getAmount(), newChar, null); // add tutbook shortcut if (item.getItemId() == 5588) { shortcut = new L2ShortCut(11, 0, 1, item.getObjectId(), 0, 1); newChar.registerShortCut(shortcut); } if (item.isEquipable() && ia.isEquipped()) newChar.getInventory().equipItemAndRecord(item); } for (L2SkillLearn skill: SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId())) { newChar.addSkill(SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel()), true); if (skill.getId() == 1001 || skill.getId() == 1177) { shortcut = new L2ShortCut(1, 0, 2, skill.getId(), skill.getLevel(), 1); newChar.registerShortCut(shortcut); } if (skill.getId() == 1216) { shortcut = new L2ShortCut(10, 0, 2, skill.getId(), skill.getLevel(), 1); newChar.registerShortCut(shortcut); } } startTutorialQuest(newChar); startNewbieHelperQuest(newChar); //new Disconnection(getClient(), newChar).defaultSequence(true); newChar.store(); newChar.deleteMe(); // send char list CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1); client.sendPacket(cl); client.setCharSelection(cl.getCharInfo()); } public void startTutorialQuest(L2PcInstance player) { QuestState qs = player.getQuestState("255_Tutorial"); Quest q = null; if (qs == null) q = QuestManager.getInstance().getQuest("255_Tutorial"); if (q != null) q.newQuestState(player); } public void startNewbieHelperQuest(L2PcInstance player) { QuestState qs = player.getQuestState("7003_NewbieHelper"); Quest q = null; if (qs == null) q = QuestManager.getInstance().getQuest("7003_NewbieHelper"); if (q != null) { q.newQuestState(player); player.getQuestState("7003_NewbieHelper").set("cond","0"); } qs = player.getQuestState("1201_NewbieToken"); q = null; if (qs == null) q = QuestManager.getInstance().getQuest("1201_NewbieToken"); if (q != null) q.newQuestState(player); } @Override public String getType() { return _C__0B_CHARACTERCREATE; } }
package battleR.gameserver.client.network.read;
import battleR.gameserver.client.network.PacketReadC;
import battleR.gameserver.client.network.write.CharCreateFail;
import battleR.gameserver.client.network.write.CharCreateOk;
import battleR.gameserver.client.network.write.CharList;
import battleR.gameserver.data.model.template.CharacterClass;
import battleR.gameserver.data.model.template.Npc;
import battleR.gameserver.data.sql.Character;
import battleR.gameserver.data.xml.CharacterData;
import battleR.gameserver.data.xml.NpcData;
/**
* <b>Пакет данных</b><br><br>
* <small>Читает содержимое из пакета данных от клиента.</small><br><br>
* <b>Полученные данные:</b><br><br>
* <small>* Имя персонажа.</small><br><br>
* <small>* Раса персонажа.</small><br><br>
* <small>* Пол персонажа.</small><br><br>
* <small>* Базовый класс персонажа.</small><br><br>
* <small>* Прическа персонажа.</small><br><br>
* <small>* Цвет прически персонажа.</small><br><br>
* <small>* Лицо персонажа.</small><br><br>
*/
public class RequestCharacterCreate extends PacketReadC {
private String name;
private byte race;
private byte sex;
private byte baseClass;
private byte hairStyle;
private byte hairColor;
private byte face;
/**
* <b>Описание</b><br>
* <small>Формирует полученный пакет данных от клиента для чтения.</small>
*/
@Override
public boolean read() {
if (byteBuffer.remaining() >= 51) {
name = readString();
race = (byte) readInt();
sex = (byte) readInt();
baseClass = (byte) readInt();
readInt();
readInt();
readInt();
readInt();
readInt();
readInt();
hairStyle = (byte) readInt();
hairColor = (byte) readInt();
face = (byte) readByte();
return true;
}
return false;
}
/**
* <b>Описание</b><br>
* <small>Отдельный поток для выполнения действий при получении пакета данных.</small>
*/
@Override
public void run() {
if (race < 0 || race > 4) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
if (face < 0 || face > 2) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
if (hairStyle < 0 || (sex == 0 && hairStyle > 4) || (sex != 0 && hairStyle > 6)) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
if (hairColor < 0 || hairColor > 3) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
name = name.replaceAll("[^A-Za-z]", "*");
if (name.contains("*") || name.length() < 3 || name.length() > 14) {
sendPacket(CharCreateFail.INCORRECT_NAME);
return;
}
for (Npc npc : NpcData.getInstance().getNpcs().values())
if (npc.getName().equals(name)) {
sendPacket(CharCreateFail.NAME_ALREADY_EXISTS);
return;
}
final String login = client.getLogin();
final Character character = new Character();
if (!character.checkAccountCharacters(login)) {
sendPacket(CharCreateFail.TOO_MANY_CHARACTERS);
return;
}
if (!character.checkServerCharacters(name)) {
sendPacket(CharCreateFail.NAME_ALREADY_EXISTS);
return;
}
final CharacterClass characterClass = CharacterData.getInstance().getCharacterClass(baseClass);
if (characterClass == null) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
if (!character.addCharacter(login, name, sex, race, baseClass, characterClass, hairStyle, hairColor, face)) {
sendPacket(CharCreateFail.CREATION_FAILED);
return;
}
sendPacket(new CharCreateOk());
sendPacket(new CharList(client));
}
}
/**
* <b>Описание</b><br>
* <small>Читает из пакета данных строку.</small>
*/
protected String readString() {
Character ch;
final StringBuilder string = new StringBuilder();
while ((ch = byteBuffer.getChar()) != 0) {
string.append(ch);
}
return string.toString();
}
Посмотрите как реализован readS тут:Посмотрел несколько сборок, там MMO не лучшим образом реализовано, методами древних времен. Но суть принципа у меня та же. Думал ну мало-ли что-то с клиентом, поменял клиент, все так же.
/**
* <b>Описание</b><br>
* <small>Читает из пакета данных строку.</small>
*/
protected String readString() {
final StringBuilder string = new StringBuilder();
int charId;
while ((charId = readShort()) != 0) {
string.append((char) charId);
}
return string.toString();
}
Попробовал, все так жеПопробуйте поменять метод на
Код:/** * <b>Описание</b><br> * <small>Читает из пакета данных строку.</small> */ protected String readString() { final StringBuilder string = new StringBuilder(); int charId; while ((charId = readShort()) != 0) { string.append((char) charId); } return string.toString(); }
private final byte[] blowfishKey;
/**
* <b>Конструктор</b><br>
* <small>Выполняет действия при создании нового экземпляра класса.</small>
* @param blowfishKey blowfish ключ.
*/
public GameCrypt(byte[] blowfishKey) {
this.blowfishKey = blowfishKey;
}
private final byte[] blowfishKey = new byte[16];
/**
* <b>Конструктор</b><br>
* <small>Выполняет действия при создании нового экземпляра класса.</small>
* @param blowfishKey blowfish ключ.
*/
public GameCrypt(byte[] blowfishKey) {
System.arraycopy(blowfishKey, 0, this.blowfishKey, 0, 16);
}
а в чем разница? с тз ява-нуба выглядит просто как два метода сделать одно и то же... длина массива обязательно указана должна быть?Все решил ))))) ура ))
Короче дело все было в blowfish ключе, он получается не верно дешифровывал пакеты данных. Ну смысла был в чем:
1. Каждому клиенту выделяется свой blowfish ключ для расшифровки, зашифровки пакета, и хранится он в экземпляре класса.
2. Я присваивал в экземпляр класса таким методом :
3. Потом изменил на:Java:private final byte[] blowfishKey; /** * <b>Конструктор</b><br> * <small>Выполняет действия при создании нового экземпляра класса.</small> * @param blowfishKey blowfish ключ. */ public GameCrypt(byte[] blowfishKey) { this.blowfishKey = blowfishKey; }
И все заработалоJava:private final byte[] blowfishKey = new byte[16]; /** * <b>Конструктор</b><br> * <small>Выполняет действия при создании нового экземпляра класса.</small> * @param blowfishKey blowfish ключ. */ public GameCrypt(byte[] blowfishKey) { System.arraycopy(blowfishKey, 0, this.blowfishKey, 0, 16); }
))
а в чем разница? с тз ява-нуба выглядит просто как два метода сделать одно и то же... длина массива обязательно указана должна быть?
Если бы было так, то значение _blowfish не зависило бы от значения blowfish, которое где-то выполняется.Существуют два основных способа передачи параметров в методы: "по значению" (pass-by-value) и "по ссылке" (pass-by-reference). В первом случае метод работает с копией значения параметра, не изменяя исходное значение. Во втором случае метод получает ссылку на объект или переменную, и любые изменения в параметре отражаются на исходном объекте или переменной.
updateKey
- key
будет со значением 0setKey
- _blowfish
будет со значением generateNewKey
.private final static byte _standartKey = 0;
private byte _blowfish;
public static void updateKey()
{
byte key = generateNewKey();
setKey(key);
key = _standartKey;
}
public static void setKey(byte blowfish)
{
_blowfish = blowfish;
}
key
на 1 позиции - он изменится и в присвоеном _blowfish
private byte[] _blowfish;
public static void updateKey()
{
byte[] key = generateNewKey();
setKey(key);
key[1] = (byte) 0;
}
public static void setKey(byte[] blowfish)
{
_blowfish = blowfish;
}
System.arraycopy(blowfish, 0, _blowfish, 0, blowfish.length());
key
- _blowfish
останется первоначальным.Ну так в том то и прикола в чем разница? с тз ява-нуба выглядит просто как два метода сделать одно и то же... длина массива обязательно указана должна быть?
Ну так в том то и приколя сделал свой вариант, потом начал искать ошибку от обратного, методом тестов узнал, что ошибка именно в бловфиш ключе и начал смотреть как в других сборках реализовано, увидел такой вариант, приминил и все отлично работает ))))
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?