GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เชชเชฐเชฟเชšเชฏ

เชถเซเชญเซ‡เชšเซเช›เชพเช“.
เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ, เชœเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€เชฎเชพเช‚ เช…เชญเซเชฏเชพเชธ เช•เชฐเชคเซ‹ เชนเชคเซ‹, เชคเซเชฏเชพเชฐเซ‡ "เชฎเชพเชนเชฟเชคเซ€ เชธเซเชฐเช•เซเชทเชพเชจเซ€ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เชชเชฆเซเชงเชคเชฟเช“" เชถเชฟเชธเซเชคเชฎเชพเช‚ เช…เชญเซเชฏเชพเชธเช•เซเชฐเชฎ เชนเชคเซ‹. เช…เชธเชพเช‡เชจเชฎเซ‡เชจเซเชŸ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเชคเซ€ เชœเซ‡ GIF เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถเชจเซ‡ เชเชฎเซเชฌเซ‡เชก เช•เชฐเซ‡. เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เชœเชพเชตเชพเชฎเชพเช‚ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เช•เซ‡เชŸเชฒเชพเช• เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฎเซเชฆเซเชฆเชพเช“เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ, เชคเซ‡เชฎเชœ เช† เชจเชพเชจเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.

เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชญเชพเช—

GIF เชซเซ‹เชฐเซเชฎเซ‡เชŸ

GIF (เช—เซเชฐเชพเชซเชฟเช•เซเชธ เช‡เชจเซเชŸเชฐเชšเซ‡เชจเซเชœ เชซเซ‹เชฐเซเชฎเซ‡เชŸ - เช›เชฌเซ€เช“เชจเซ€ เช†เชชเชฒเซ‡ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชซเซ‹เชฐเซเชฎเซ‡เชŸ) เช เช—เซเชฐเชพเชซเชฟเช• เช›เชฌเซ€เช“เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช›เซ‡, เชœเซ‡ 256 เชฐเช‚เช—เซ‹ เชธเซเชงเซ€เชจเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช—เซเชฃเชตเชคเซเชคเชพเชจเซ€ เช–เซ‹เชŸ เชตเชฟเชจเชพ เชธเช‚เช•เซเชšเชฟเชค เชกเซ‡เชŸเชพเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เช›เซ‡. เช† เชซเซ‹เชฐเซเชฎเซ‡เชŸ 1987 (GIF87a) เชฎเชพเช‚ CompuServe เชฆเซเชตเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ เชชเชฐ เชฐเชพเชธเซเชŸเชฐ เชˆเชฎเซ‡เชœเซ€เชธ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. 1989 เชฎเชพเช‚, เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ (GIF89a), เชชเชพเชฐเชฆเชฐเซเชถเชฟเชคเชพ เช…เชจเซ‡ เชเชจเชฟเชฎเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚.

GIF เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชฌเซเชฒเซ‹เช• เชฎเชพเชณเช–เซเช‚ เชนเซ‹เชฏ เช›เซ‡. เช† เชฌเซเชฒเซ‹เช•เซเชธเชจเซ€ เชนเช‚เชฎเซ‡เชถเชพ เชจเชฟเชถเซเชšเชฟเชค เชฒเช‚เชฌเชพเชˆ เชนเซ‹เชฏ เช›เซ‡ (เช…เชฅเชตเชพ เชคเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชซเซเชฒเซ‡เช—เซเชธ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡), เชคเซ‡เชฅเซ€ เชฆเชฐเซ‡เช• เชฌเซเชฒเซ‹เช• เช•เซเชฏเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เชญเซ‚เชฒ เช•เชฐเชตเซ€ เชฒเช—เชญเช— เช…เชถเช•เซเชฏ เช›เซ‡. GIF89a เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชธเชฐเชณ เชฌเชฟเชจ-เชเชจเชฟเชฎเซ‡เชŸเซ‡เชก GIF เช›เชฌเซ€เชจเซเช‚ เชฎเชพเชณเช–เซเช‚:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เชฌเช‚เชงเชพเชฐเชฃเชจเชพ เชคเชฎเชพเชฎ เชฌเซเชฒเซ‹เช•เซเชธเชฎเชพเช‚เชฅเซ€, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸ เชฌเซเชฒเซ‹เช• เช…เชจเซ‡ เชชเซ‡เชฒเซ‡เชŸ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชฎเชพเช‚ เชฐเชธ เชนเชถเซ‡:

  • CT - เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸเชจเซ€ เชนเชพเชœเชฐเซ€. เชœเซ‹ เช† เชงเซเชตเชœ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เชนเซ‹เชฏ, เชคเซ‹ เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸ เชฒเซ‹เชœเชฟเช•เชฒ เชธเซเช•เซเชฐเซ€เชจ เชนเซ‡เชจเซเชกเชฒ เชชเช›เซ€ เชคเชฐเชค เชœ เชถเชฐเซ‚ เชฅเชตเซ€ เชœเซ‹เชˆเช.
  • Size - เชšเชฟเชคเซเชฐเชฎเชพเช‚ เชชเซ‡เชฒเซ‡เชŸเชจเซเช‚ เช•เชฆ เช…เชจเซ‡ เชฐเช‚เช—เซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ. เช† เชชเชฐเชฟเชฎเชพเชฃ เชฎเชพเชŸเซ‡เชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹:

เชฎเชพเชช
เชฐเช‚เช—เซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ
เชชเซ‡เชฒเซ‡เชŸเชจเซเช‚ เช•เชฆ, เชฌเชพเช‡เชŸเซเชธ

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เชชเชฆเซเชงเชคเชฟเช“

เช‡เชฎเซ‡เชœ เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถเชพเชจเซ‡ เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡:

  • LSB (เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฌเชฟเชŸ) เชชเชฆเซเชงเชคเชฟ
  • เชชเซ‡เชฒเซ‡เชŸ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟ

LSB เชชเชฆเซเชงเชคเชฟ - เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€เชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชชเชฆเซเชงเชคเชฟ. เชคเซ‡เชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚เชจเชพ เช›เซ‡เชฒเซเชฒเชพ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฌเชฟเชŸเซเชธ (เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸ เชฌเชพเช‡เชŸเซเชธ) เชจเซ‡ เช›เซเชชเชพเชฏเซ‡เชฒเชพ เชธเช‚เชฆเซ‡เชถเชจเชพ เชฌเชฟเชŸเซเชธ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช† เชชเชฆเซเชงเชคเชฟเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸ เชฌเชพเชˆเชŸเซเชธเชฎเชพเช‚ เช›เซ‡เชฒเซเชฒเชพ เชฌเซ‡ เชฌเชฟเชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‡. เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ 24-เชฌเซ€เชŸ เช‡เชฎเซ‡เชœ เชฎเชพเชŸเซ‡, เชœเซเชฏเชพเช‚ เชฐเช‚เช— เชชเซ…เชฒเซ‡เชŸ เชฒเชพเชฒ, เชตเชพเชฆเชณเซ€ เช…เชจเซ‡ เชฒเซ€เชฒเชพ เชฎเชพเชŸเซ‡ เชคเซเชฐเชฃ เชฌเชพเช‡เชŸเซเชธ เช›เซ‡, เชคเซ‡เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถ เชเชฎเซเชฌเซ‡เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฆเชฐเซ‡เช• เชฐเช‚เช— เช˜เชŸเช• เชฎเชนเชคเซเชคเชฎ 3/255 เช—เซเชฐเซ‡เชกเซ‡เชถเชจ เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชพเชถเซ‡. เช†เชตเซ‹ เชซเซ‡เชฐเชซเชพเชฐ, เชธเซŒเชชเซเชฐเชฅเชฎ, เชฎเชพเชจเชต เช†เช‚เช– เชฎเชพเชŸเซ‡ เช…เชฆเซเชฐเชถเซเชฏ เช…เชฅเชตเชพ เช…เช˜เชฐเซ‹ เชนเชถเซ‡, เช…เชจเซ‡ เชฌเซ€เชœเซเช‚, เชคเซ‡ เช“เช›เซ€-เช—เซเชฃเชตเชคเซเชคเชพเชตเชพเชณเชพ เชฎเชพเชนเชฟเชคเซ€ เช†เช‰เชŸเชชเซเชŸ เช‰เชชเช•เชฐเชฃเซ‹ เชชเชฐ เชฆเซ‡เช–เชพเชถเซ‡ เชจเชนเซ€เช‚.

เชฎเชพเชนเชฟเชคเซ€เชจเซ‹ เชœเชฅเซเชฅเซ‹ เช‡เชฎเซ‡เชœ เชชเซ‡เชฒเซ‡เชŸเชจเชพ เช•เชฆ เชชเชฐ เชธเซ€เชงเซ‹ เช†เชงเชพเชฐ เชฐเชพเช–เชถเซ‡. เชชเซ‡เชฒเซ‡เชŸเชจเซเช‚ เชฎเชนเชคเซเชคเชฎ เช•เชฆ 256 เชฐเช‚เช—เซ‹เชจเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เช…เชจเซ‡ เชœเซ‹ เชฆเชฐเซ‡เช• เชฐเช‚เช—เชจเชพ เช˜เชŸเช•เชฎเชพเช‚ เชฌเซ‡ เชธเช‚เชฆเซ‡เชถ เชฌเชฟเชŸเซเชธ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡, เชคเซ‹ เชฎเชนเชคเซเชคเชฎ เชธเช‚เชฆเซ‡เชถ เชฒเช‚เชฌเชพเชˆ (เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชฎเชนเชคเซเชคเชฎ เชชเซ‡เชฒเซ‡เชŸ เชธเชพเชฅเซ‡) 192 เชฌเชพเช‡เชŸเซเชธ เช›เซ‡. เชเช•เชตเชพเชฐ เชฎเซ‡เชธเซ‡เชœ เชˆเชฎเซ‡เชœเชฎเชพเช‚ เชเชฎเซเชฌเซ‡เชก เชฅเชˆ เชœเชพเชฏ เชชเช›เซ€, เชซเชพเชˆเชฒเชจเซเช‚ เช•เชฆ เชฌเชฆเชฒเชพเชคเซเช‚ เชจเชฅเซ€.

เชชเซ‡เชฒเซ‡เชŸ เชตเชฟเชธเซเชคเชฐเชฃ เชชเชฆเซเชงเชคเชฟ, เชœเซ‡ เชฎเชพเชคเซเชฐ GIF เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชจเชพเชจเชพ เชชเซ‡เชฒเซ‡เชŸ เชธเชพเชฅเซ‡เชจเซ€ เช›เชฌเซ€เช“ เชชเชฐ เชธเซŒเชฅเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชฐเชนเซ‡เชถเซ‡. เชคเซ‡เชจเซ‹ เชธเชพเชฐ เช เช›เซ‡ เช•เซ‡ เชคเซ‡ เชชเซ‡เชฒเซ‡เชŸเชจเชพ เช•เชฆเชฎเชพเช‚ เชตเชงเชพเชฐเซ‹ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเชพเชฅเซ€ เช•เชฒเชฐ เชฌเชพเชˆเชŸเชจเซ€ เชœเช—เซเชฏเชพเช เชœเชฐเซ‚เชฐเซ€ เชฌเชพเชˆเชŸ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชœเช—เซเชฏเชพ เชฎเชณเซ‡ เช›เซ‡. เชœเซ‹ เช†เชชเชฃเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเช เช•เซ‡ เชชเซ‡เชฒเซ‡เชŸเชจเซเช‚ เชฒเช˜เซเชคเซเชคเชฎ เช•เชฆ 2 เชฐเช‚เช—เซ‹ (6 เชฌเชพเช‡เชŸเซเชธ) เช›เซ‡, เชคเซ‹ เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เชฎเชนเชคเซเชคเชฎ เช•เชฆ 256 ร— 3โ€“6 = 762 เชฌเชพเช‡เชŸเซเชธ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เช—เซ‡เชฐเชฒเชพเชญ เช เช“เช›เซ€ เช•เซเชฐเชฟเชชเซเชŸเซ‹เช—เซเชฐเชพเชซเชฟเช• เชธเซเชฐเช•เซเชทเชพ เช›เซ‡; เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชธเช‚เชฆเซ‡เชถ เช•เซ‹เชˆเชชเชฃ เชŸเซ‡เช•เซเชธเซเชŸ เชเชกเชฟเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชœเซ‹ เชธเช‚เชฆเซ‡เชถ เชตเชงเชพเชฐเชพเชจเชพ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจเชจเซ‡ เช†เชงเชฟเชจ เชจ เชนเซ‹เชฏ.

เชตเซเชฏเชตเชนเชพเชฐเซ เชญเชพเช—

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชกเชฟเชเชพเช‡เชจ

เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เช…เชจเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡เชจเชพ เชคเชฎเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เชธเชพเชงเชจเซ‹ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. com.tsarik.steganography. เช† เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ Encryptor เชชเชฆเซเชงเชคเชฟเช“ เชธเชพเชฅเซ‡ encrypt ะธ decrypt, เชตเชฐเซเช— Binary, เชœเซ‡ เชฌเซ€เชŸ เชเชฐเซ‡, เชคเซ‡เชฎเชœ เช…เชชเชตเชพเชฆ เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ UnableToEncryptException ะธ UnableToDecryptException, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฆเซเชงเชคเชฟเช“เชฎเชพเช‚ เชฅเชตเซ‹ เชœเซ‹เชˆเช Encryptor เช…เชจเซเช•เซเชฐเชฎเซ‡ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช…เชจเซ‡ เชกเซ€เช•เซ‹เชกเชฟเช‚เช— เชญเซ‚เชฒเซ‹เชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚.

เชฎเซเช–เซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซ‡เช•เซ‡เชœ com.tsarik.programs.gifed เชธเซเชฅเชฟเชฐ เชชเชฆเซเชงเชคเชฟ เชธเชพเชฅเซ‡ เชšเชฒเชพเชตเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซเชฒเชพเชธเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเชถเซ‡ main, เชคเชฎเชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡; เชเช• เชตเชฐเซเช— เช•เซ‡ เชœเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡; เช…เชจเซ‡ เช…เชจเซเชฏ เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡เชจเชพ เชชเซ‡เช•เซ‡เชœเซ‹.

เชเชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ com.tsarik.programs.gifed.gif เชตเชฐเซเช—เซ‹ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod. เช† เชฌเช‚เชจเซ‡ เชตเชฐเซเช—เซ‹ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‹ เช…เชฎเชฒ เช•เชฐเชถเซ‡ Encryptor.

GIF เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ€ เชฐเชšเชจเชพเชจเชพ เช†เชงเชพเชฐเซ‡, เชคเชฎเซ‡ เช‡เชฎเซ‡เชœ เชชเซ‡เชฒเซ‡เชŸเชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถ เชฐเชœเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชนเชพเชœเชฐเซ€ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเช‚เชฆเซ‡เชถเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชฌเชฟเชŸเซเชธเชจเซ‹ เชšเซ‹เช•เซเช•เชธ เช•เซเชฐเชฎ เช‰เชฎเซ‡เชฐเชตเซ‹ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชœเซ‡ เชกเซ€เช•เซ‹เชกเชฐ เชชเชนเซ‡เชฒเชพ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชถเซเชฆเซเชงเชคเชพ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธเซ‡ เช›เซ‡. เชœเซ‹ เชคเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซเช‚ เชจเชฅเซ€, เชคเซ‹ เชเชตเซเช‚ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เช›เชฌเซ€เชฎเชพเช‚ เช•เซ‹เชˆ เช›เซเชชเชพเชฏเซ‡เชฒ เชธเช‚เชฆเซ‡เชถ เชจเชฅเซ€. เช†เช—เชณ เชคเชฎเชพเชฐเซ‡ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชฒเช‚เชฌเชพเชˆเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเช›เซ€ เชฎเซ‡เชธเซ‡เชœเชจเซ‹ เชœ เชŸเซ‡เช•เซเชธเซเชŸ.

เชธเชฎเช—เซเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‹ เชตเชฐเซเช— เช†เช•เซƒเชคเชฟ:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชธเชฎเช—เซเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‡ เชฌเซ‡ เช˜เชŸเช•เซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡: เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เช…เชจเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชถเชจ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช…เชฎเชฒ Encryptor, เชตเชฐเซเช—เซ‹เชฎเชพเช‚ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod, เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‹ เช…เชฎเชฒ.

เชตเชฐเซเช—เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹ GIFEncryptorByLSBMethod.

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เช•เซเชทเซ‡เชคเซเชฐเซ‹ firstLSBit ะธ secondLSBit เช‡เชฎเซ‡เชœเชจเชพ เชชเซเชฐเชคเซเชฏเซ‡เช• เชฌเชพเช‡เชŸเชจเชพ เชฌเชฟเชŸเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชถเชพเชฎเซ‡เชฒ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถ เชฆเชพเช–เชฒ เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช เช…เชจเซ‡ เชœเซเชฏเชพเช‚เชฅเซ€ เชธเช‚เชฆเซ‡เชถ เชตเชพเช‚เชšเชตเซ‹ เชœเซ‹เชˆเช. เช•เซเชทเซ‡เชคเซเชฐ checkSequence เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชธเช‚เชฆเซ‡เชถเชจเซ€ เช“เชณเช–เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชšเซ‡เช• เชฌเซ€เชŸ เช•เซเชฐเชฎ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชธเซเชฅเชฟเชฐ เชชเชฆเซเชงเชคเชฟ getEncryptingFileParameters เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชซเชพเช‡เชฒเชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เช…เชจเซ‡ เชธเช‚เชญเชตเชฟเชค เชธเช‚เชฆเซ‡เชถเชพเชจเซ€ เชฒเชพเช•เซเชทเชฃเชฟเช•เชคเชพเช“ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

เชชเชฆเซเชงเชคเชฟ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ encrypt เชตเชฐเซเช— GIFEncryptorByLSBMethod:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช•เซ‹เชก:

@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	if (out == null) {
		throw new NullPointerException("Output file is null");
	}
	if (text == null) {
		throw new NullPointerException("Text is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToEncodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
	
	if (possibleTextLength < text.length()) {
		throw new UnableToEncodeException("Text is too big");
	}
	
	int n = 13;
	
	// write check sequence
	for (int i = 0; i < checkSequence.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = checkSequence[2*i];
		ba[secondLSBit] = checkSequence[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write text length
	byte[] cl = Binary.toBitArray((byte)text.length());
	for (int i = 0; i < cl.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = cl[2*i];
		ba[secondLSBit] = cl[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write message
	byte[] textBytes = text.getBytes();
	for (int i = 0; i < textBytes.length; i++) {
		byte[] c = Binary.toBitArray(textBytes[i]);
		for (int ci = 0; ci < c.length/2; ci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			ba[firstLSBit] = c[2*ci];
			ba[secondLSBit] = c[2*ci+1];
			bytes[n] = Binary.toByte(ba);
			n++;
		}
	}
	
	// write output file
	OutputStream os = new FileOutputStream(out);
	os.write(bytes);
	os.close();
}

เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช…เชจเซ‡ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก decrypt เชตเชฐเซเช— GIFEncryptorByLSBMethod:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToDecodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;	// one byte for check and one byte for message length
	
	int n = 13;
	
	// read check sequence
	byte[] csBits = new byte[checkSequence.length];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		csBits[2*i] = ba[firstLSBit];
		csBits[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte cs = Binary.toByte(csBits);
	
	if (cs != Binary.toByte(checkSequence)) {
		throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
	}
	
	// read text length
	byte[] cl = new byte[8];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		cl[2*i] = ba[firstLSBit];
		cl[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte textLength = Binary.toByte(cl);
	
	if (textLength < 0) {
		throw new UnableToDecodeException("Decoded text length is less than 0");
	}
	if (possibleTextLength < textLength) {
		throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
	}
	
	// read text bits and make text bytes
	byte[] bt = new byte[textLength];
	for (int i = 0; i < bt.length; i++) {
		byte[] bc = new byte[8];
		for (int bci = 0; bci < bc.length/2; bci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			bc[2*bci] = ba[firstLSBit];
			bc[2*bci+1] = ba[secondLSBit];
			n++;
		}
		bt[i] = Binary.toByte(bc);
	}
	
	return new String(bt);
}

เชตเชฐเซเช—เชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ GIFEncryptorByPaletteExtensionMethod เชธเชฎเชพเชจ เชนเชถเซ‡, เชฎเชพเชคเซเชฐ เชฎเชพเชนเชฟเชคเซ€ เชธเชพเชšเชตเชตเชพเชจเซ€/เชตเชพเช‚เชšเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟ เช…เชฒเช— เช›เซ‡.

เชตเชฐเซเช— เชฎเชพเช‚ MainFrame เชฐเซ‡เชชเชฐ เชชเชฆเซเชงเชคเชฟเช“ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡: encryptImage(Encryptor encryptor) ะธ decryptImage(Encryptor encryptor), เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฆเซเชงเชคเชฟเช“เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ Encryptor เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€, เชเชŸเชฒเซ‡ เช•เซ‡ เชซเชพเช‡เชฒ เชชเชธเช‚เชฆเช—เซ€ เชธเช‚เชตเชพเชฆ เช–เซ‹เชฒเชตเซ‹, เชญเซ‚เชฒ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฆเชฐเซเชถเชพเชตเชตเซ€, เชตเช—เซ‡เชฐเซ‡; เชคเซ‡เชฎเชœ เช…เชจเซเชฏ เชชเชฆเซเชงเชคเชฟเช“: openImage(), เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชเช• เช›เชฌเซ€ เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡, exit(), เชœเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ‡ เช›เซ‡. เช† เชชเชฆเซเชงเชคเชฟเช“ เชฎเชพเช‚เชฅเซ€ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ Actionเชจเซ€ เช…เชจเซเชฐเซ‚เชช เชฎเซ‡เชจเซ เชตเชธเซเชคเซเช“. เช† เชตเชฐเซเช— เชตเชงเชพเชฐเชพเชฎเชพเช‚ เชธเชนเชพเชฏเช• เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ‡ เช›เซ‡: createComponents() - เชซเซ‹เชฐเซเชฎ เช˜เชŸเช•เซ‹เชจเซ€ เชฐเชšเชจเชพ, loadImageFile(File f) โ€” เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชธเซเชชเซ‡เชถเชฟเชฏเชฒ เช•เชฎเซเชชเซ‹เชจเชจเซเชŸเชฎเชพเช‚ เช‡เชฎเซ‡เชœ เชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. เชตเชฐเซเช—เชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ GIFEncryptorByPaletteExtensionMethod เชตเชฐเซเช— เช…เชฎเชฒเซ€เช•เชฐเชฃ เชธเชฎเชพเชจ GIFEncryptorByLSBMethod, เชฎเซเช–เซเชฏ เชคเชซเชพเชตเชค เชชเซ‡เชฒเซ‡เชŸเชฎเชพเช‚เชฅเซ€ เชธเช‚เชฆเซ‡เชถ เชฌเชพเชˆเชŸ เชฒเช–เชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชตเชพเช‚เชšเชตเชพเชจเซ€ เชฐเซ€เชคเชฎเชพเช‚ เช›เซ‡.

เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ เช•เชพเชฎเช—เซ€เชฐเซ€

เชเชฒเชฌเซ€เชเชธ เชชเชฆเซเชงเชคเชฟ

เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช†เชจเชพ เชœเซ‡เชตเซ€ เชเช• เช›เชฌเซ€ เช›เซ‡:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เช† เชˆเชฎเซ‡เชœเชฎเชพเช‚, เชชเซ‡เชฒเซ‡เชŸเชฎเชพเช‚ 256 เชฐเช‚เช—เซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ (เชœเซ‡เชฎ เชชเซ‡เชˆเชจเซเชŸ เชธเซ‡เชต เช•เชฐเซ‡ เช›เซ‡). เชชเซเชฐเชฅเชฎ เชšเชพเชฐ เชฐเช‚เช—เซ‹ เช›เซ‡: เชธเชซเซ‡เชฆ, เช•เชพเชณเซ‹, เชฒเชพเชฒ, เชฒเซ€เชฒเซ‹. เช…เชจเซเชฏ เชฐเช‚เช—เซ‹ เช•เชพเชณเชพ เช›เซ‡. เชตเซˆเชถเซเชตเชฟเช• เชชเซ‡เชฒเซ‡เชŸ เชฌเซ€เชŸ เช•เซเชฐเชฎ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เชนเชถเซ‡:

11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เชเช•เชตเชพเชฐ เชธเช‚เชฆเซ‡เชถ เชเชฎเซเชฌเซ‡เชก เชฅเชˆ เชœเชพเชฏ, เชชเช›เซ€ เชฐเซ‡เช–เชพเช‚เช•เชฟเชค เชฌเชฟเชŸเซเชธ เชธเช‚เชฆเซ‡เชถเชจเชพ เชฌเชฟเชŸเซเชธ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ€ เช›เชฌเซ€ เชฒเช—เชญเช— เชฎเซ‚เชณเชฅเซ€ เช…เชฒเช— เชจเชฅเซ€.

เชฎเซ‚เชณ
เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชธเช‚เชฆเซ‡เชถ เชธเชพเชฅเซ‡เชจเซ€ เช›เชฌเซ€

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€
GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เชชเซ‡เชฒเซ‡เชŸ เชตเชฟเชธเซเชคเชฐเชฃ เชชเชฆเซเชงเชคเชฟ

เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เช† เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เชฆเซ‡เชถ เชงเชฐเชพเชตเชคเซ€ เช›เชฌเซ€ เช–เซ‹เชฒเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเซเช‚ เชšเชฟเชคเซเชฐ เชฆเซ‡เช–เชพเชถเซ‡:

GIF เชฎเชพเช‚ เชธเซเชŸเซ‡เช—เชจเซ‹เช—เซเชฐเชพเชซเซ€

เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เช† เชชเชฆเซเชงเชคเชฟ เชธเช‚เชชเซ‚เชฐเซเชฃ เชœเชพเชธเซ‚เชธเซ€ เชชเซเชฐเชตเซƒเชคเซเชคเชฟเช“ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚, เช…เชจเซ‡ เชธเช‚เชฆเซ‡เชถเชจเชพ เชตเชงเชพเชฐเชพเชจเชพ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡.

เชเชจเชฟเชฎเซ‡เชŸเซ‡เชก เชˆเชฎเซ‡เชœเซ€เชธเชฎเชพเช‚ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ/เชกเชฟเช•เซเชฐเชฟเชชเซเชถเชจ เชฐเซ‡เช—เซเชฏเซเชฒเชฐ เชธเซเชŸเซ‡เชŸเชฟเช• เชˆเชฎเซ‡เชœเซ€เชธเชจเซ€ เชœเซ‡เชฎ เชœ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชเชจเชฟเชฎเซ‡เชถเชจ เชคเซ‚เชŸเซ€ เช—เชฏเซเช‚ เชจเชฅเซ€.

เชตเชชเชฐเชพเชฏเซ‡เชฒ เชธเซเชคเซเชฐเซ‹เชคเซ‹:

เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹