WTai.Tk
HOMEUPLOADFORUM
23/04/201810:36:00
Chào: khách!
Đăng nhập
Đăng ký
HOME > Java > Hướng dẫn lập trình
Tìm kiếm | Lượt xem: 682
↓↓ [HD] Kĩ thuật packing, unpacking (TeaM)
* ServantOfEvil (Spam) [Off]
Exp: 322 | 381/208
Xu: 96668451
Tôi bị điên.
Cách đây 10 tháng #1
Dạo này thấy box j2me cũng sôi phết mà chẳng thấy top nào hướng dẫn j2me cả. Xem cả box hướng dẫn lập trình 20 mấy bài mà lác đác được 1 số bài còn toàn là "tìm hàm chat", ...
Hôm nay mình xin mạn phép bỏ chút time viết bài để giới thiệu kĩ thuật packing, unpacking file(chỉ dành cho người chưa biết. Pro đã biết ~> lẳng lặng bước ra ). Mong rằng sau top này các cô, dì, chú, bác sẽnhiệt tình đăng top hướng dẫn ae đam mê j2me những thứ mình biết hơn(giấu làm gì để rồi phải share ). Lề thế đủ rồi, vào bài:
Như các bạn đã biết, packing là gộp 2 hoặc nhiều file làm 1, ứng dụng trong mã hoá và giảm dung lượng...Nhưng pack kiểu gì để sau này unpack ra file con để dùng mới là vấn đề. Chính vậy mà chúng ta phải tạo cho nó 1 cấu trúc để dựa vào cấu trúc đó làm code unpack được. Ở đây tôi sẽ lấy ví dụ cụ thể là các file ảnh và etc...của game Team cho nó quen thuộc.
1 File pack của Team cócấu trúc nhưsau:
*1 byte đầu (byte) : lưu số lượng file con của file pack[size].
*cấu trúc lặp lại size lần:
-1 byte (byte) : độ dài tên file con [fnl];
- fnl byte tiếp (byte) : tên file(bị mã hoá) .
- 2 byte (short) : độ dài data file con.
*phần còn lại: tổng data file con(bị mã hoá).

Điều đáng chú ý là data file con không nằm xen kẽ nhau mà được ghi kế tiếp nhau luôn nên phải cắt chúng ra rồi ghi ra file. Chúng ta có class unpack file như sau.
import javax.microedition.io.file.*;
import javax.microedition.io.*;
import java.io.*;
class unpacker
{
    FileConnection fc, fc1; //ket noi voi file can doc, ghi
    DataInputStream dis;
    //doc file
    OutputStream os;
    //ghi file
    int i1 = 0, size;
    // lan luot la bien dem data va so luong file con
    String[] str;
    //luu ten file
    int[][] offset;
    //luu offset va length cua data file con trong file me
     byte[] data;
//luu data file con
    void unpack(String cpath, String savefolder)
    {
        try
        {
            fc = (FileConnection) Connector.open("file:///" + cpath);
            fc1 = (FileConnection) Connector.open("file:///" + savefolder + "unpack/");
            if (!fc1.exists()) fc1.mkdir();
            fc1.close();
            dis = fc.openDataInputStream();
            size = dis.readUnsignedByte();
 str = new String[size];
offset = new int[2][size];
            for (int i = 0; i < size; i++)
            {
                int fnl = dis.readByte();
                byte[] bt = new byte[fnl];
                dis.read(bt);
                encode(bt);
                str[i] = new String(bt);
                offset[0][i] = i1;
                offset[1][i] = dis.readUnsignedShort();
                i1 += offset[1][i];
            }
            data = new byte[i1];
            dis.readFully(data);
            encode(data);
            fc.close();
            dis.close();
            for (int k = 0; k < size; k++)
            {
                fc1 = (FileConnection) Connector.open("file:///" + savefolder + "unpack/" + str[k]);
                if (!fc1.exists()) fc1.create();
                os = fc1.openOutputStream();
                os.write(data, offset[0][k], offset[1][k]);
                os.close();
                fc1.close();
            } catch(Exception ex)
            {
            }
        }
    }
}
1 method dùng giải mã và mã hoá dữ liệu của TeaM
byte[] encode = {78, 103, 117, 121, 101, 110, 86, 97, 110, 77, 105, 110, 104}; //mảng số dùng mã hoá của TeaM
void encode(byte[] b)
{
    for (int i = 0; i < b.length; i++)
    {
        b[i] = (byte)(b[i] ^ encode[i % encode.length]);
    }
}
Class dùng pack file như sau:
import javax.microedition.io.file.*;
import javax.microedition.io.*;
import java.io.*;
class packer
{
    StringBuffer sb1, sb2;/* lan luot dung de luu so file con,
do dai ten file con, ten file con,
do dai data file con va data file con */
    InputStream is;
    FileConnection fc, fc1 // lan luot dung ket noi voi file dau vao, ra
    OutputStream os;
    void pack(String[] filepath, String savefolder)
    {
        try
        {
            sb1 = new StringBuffer();
            sb2 = new StringBuffer();
            fc1 = (FileConnection) Connector.open("file:/ //" + savefolder + "pack/");
            if (!fc1.exists()) fc1.mkdir();
            fc1.close();
            sb1.append((char) filepath.length); //so file con
            for (int i = 0; i < filepath.length; i++)
            {
                String fn = filepath[i].substring(filepath[i].lastIndexOf('/', filepath[i].length()) + 1);
                sb1.append((char) fn.length());
                byte[] bt = fn.getBytes();
                encode(bt);
                fn = new String(bt);
                //do dai ten file con bi ma hoa
                sb1.append(fn);
                //ten file con
                fc = (FileConnection) Connector.open("file:///" + filepath[i]);
                is = fc.openInputStream();
                long l = fc.fileSize();
                sb1.append((char)((int)(0xFF & (l >> 8))));
                sb1.append((char)((int) l & 0xFF));
                //bieu dien do dai data file con bang 2 byte
                int j;
                while ((j = is.read) != -1) sb2.append((char) j);
                //data file con
            }
            byte[] b = sb2.toString().getBytes();
            encode(b);
            String str = sb1.toString() + new String(b);
            FileConnection fc1 = (FileConnection) Connector.open("file:///" + savefolder + "pack/pack.dat");
            if (!fc1.exists()) fc1.create();
            os = fc1.openOutputStream();
            os.write(str.getBytes());
            is.close();
            os.close();
            fc.close();
            fc1.close();
        } catch(Exception ex)
        {
        }
    }
}
Phù! Bài viết của tôi đến đây là kết thúc. Mong là ai cũng hiểu ít nhất là 1 phần code trên là do tôi tự viết nên không thể tránh khỏi sai xót mong được các bạn góp ý để hoàn thiện bài.
Đây là link src mà tôi viết lại của Lê Trần Anh chỉ nhằm mục nghiên cứu.
Tải xuống ImageTeaM-src.zip (26.91 KB)
Ai ghé qua rồi dù không đọc cũng phải like ủng hộ đấy nhé . Bấm phím cả buổi chiều rát cả tay .
[9] hoichemgio9x, Nguyễn Hoàng Thuận, Nvcpro, NhokTapYeu, Maam, RoSino18k, Người Sắt, PMTpro, ☆™VinhVIP™☆,
Edited: ServantOfEvil. 10:28 21/06 [5]
* ServantOfEvil (Spam) [Off]
Exp: 322 | 381/208
Xu: 96668451
Tôi bị điên.
Cách đây 10 tháng #2
@Người Sắt @Darkrai @☆™VinhVIP™☆ @lktpro cảm ơn đã giúp đỡ trong quá trìng nghiên cứu
[2] skypeaful, Người Sắt,
* Người Sắt (Admin) [Off]
Exp: 151 | 212/23
Xu: 138065
JAV đi-vá-lốp-mòn
Cách đây 10 tháng #3
Anh em way tay dot tê ka rất đảm đang hẳn là sexnhiệt tình.
[1] ServantOfEvil,
* PMTpro (Hot Boy) [Off]
Exp: 1060 | 772/1881
Xu: 74896285
Phù.Du!
Cách đây 10 tháng #4
Like k test
* ServantOfEvil (Spam) [Off]
Exp: 322 | 381/208
Xu: 96668451
Tôi bị điên.
Cách đây 10 tháng #5
Mấy cái Connector.open lỗi hết là tđn
* Người Sắt (Admin) [Off]
Exp: 151 | 212/23
Xu: 138065
JAV đi-vá-lốp-mòn
Cách đây 10 tháng #6
Gửi từ: ServantOfEvil

Mấy cái Connector.open lỗi hết là tđn


Code lọc text nó nuốt mẹ mất chữ
[1] ServantOfEvil,
* clombies123 (Memb) [Off]
Exp: 454 | 363/20
Xu: 26687
Muốn TRYM to không khó~Chỉ Cần Gái giơ LÌN cho ta
Cách đây 10 tháng #7
Pm này dùng để làm éo gì
* RoSino18k (FMod) [Off]
Exp: 74 | 113/61
Xu: 100177353
Tàu ngầm =))
Cách đây 10 tháng #8
Đọc chả hiểu gì cũng bắt ngta like. Đã thế đập luôn 2 cái like vào mặt cho bõ ghét. Bao giờ học j2me thì đọc lại còn giờ chưa biết viết hello world
[1] ServantOfEvil,
* ServantOfEvil (Spam) [Off]
Exp: 322 | 381/208
Xu: 96668451
Tôi bị điên.
Cách đây 10 tháng #9
Gửi từ: clombies123

Pm này dùng để làm éo gì

đã bh chú muốn vh hình ảnh mà tìm mãi k thấy ảnh đó chưa?
* clombies123 (Memb) [Off]
Exp: 454 | 363/20
Xu: 26687
Muốn TRYM to không khó~Chỉ Cần Gái giơ LÌN cho ta
Cách đây 10 tháng #10
Gửi từ: ServantOfEvil

đã bh chú muốn vh hình ảnh mà tìm mãi k thấy ảnh đó chưa?

Của teamobi à
123>>
Bài viết cùng chuyên mục
Hướng dẫn viết app xem thời khoá biểu online không cần host! [18]
Một số phương thức của lớp RecordStore, và help :v [3]
Bàn luận về Thread [19]
Xin up lại bài Liên kết class [37]
[HD j2me] Tạo thuật toán giải mã và mã hóa ảnh socogame đuôi .rsp [17]
Chia sẻ bài viết
BBCode:

Link:

Link nhanh:
Trực tuyến [0 user] [2 khách]
Không có thành viên nào trực tuyến!