Java2009. 3. 17. 14:34

class Lotto {
    public static void main(String[] args) {
        Lotto lotto = new Lotto();
        for(int i=0; i<100; i++)
            System.out.print(lotto.getLottoNum() + ((i+1)%5==0?"\n":"\t"));
    }

    public String getLottoNum() {
        StringBuffer sb = new StringBuffer();
        int[] num = this.createLottoNum();
        num = this.sort(num);
        for(int i:num) {
            if(i<10) sb.append("0" + Integer.toString(i) + " ");
            else sb.append(Integer.toString(i) + " ");
        }
        return sb.toString();
    }

    //get random number(6place within 1 to 45)
    private int[] createLottoNum() {
        int[] num = new int[6];
        for(int i=0; i<num.length; i++) {
            num[i] = (int)((Math.random()*45)+1);
            for(int j=0; j<i; j++)
                if(num[i] == num[j]) {
                    i--;
                    break;
                }
        }
        return num;
    }

    //bubble sort
    private int[] sort(int[] num) {
        int tmp;
        for(int i=0; i<num.length-1; i++) {
            for(int j=0; j<num.length-i-1; j++) {
                if(num[j] > num[j+1]) {
                    tmp = num[j];
                    num[j] = num[j+1];
                    num[j+1] = tmp;
                }
            }
        }
        return num;
    }
}

'Java' 카테고리의 다른 글

Base64 encode & decode in Java  (0) 2009.03.17
자바 랜덤 문자열 생성  (0) 2009.03.10
JSTL forEach forToken  (0) 2008.10.02
스타시디키 checksum Java & C# 소스  (0) 2008.09.26
Posted by Main()
Java2009. 3. 17. 10:51
/**
* Title: Base64
* Description: encoder et decode en base64
* class base64
*
* @author Isaac Mekueko
* @version 1.0
*/

public final class Base64 {
    static private final byte PADDING            = ( byte ) '=';
    static private final int  SIGN               = -128;
    static private byte [] Encodebase64Alphabet  = new byte[64];
    static private byte [] alphaDecode           =new byte[256];

    static {
        for(int i=0;i<=25;i++)
            Encodebase64Alphabet[i] = (byte)('A'+i);
        for(int i=26,j=0;i<=51;i++,j++)
            Encodebase64Alphabet[i] = (byte)('a'+j);
        for(int i=52,j=0;i<=61;i++,j++)
            Encodebase64Alphabet[i] = (byte)('0'+j);
        Encodebase64Alphabet[62] = (byte)('+');
        Encodebase64Alphabet[63] = (byte)('/');

      // decode
        for(int i=0;i<256;i++)
            alphaDecode[i] = -1;
        for(int i='A',j=0;i<='Z';i++,j++)
            alphaDecode[i] = (byte)j;
        for(int i='a',j=26;i<='z';i++,j++)
            alphaDecode[i] = (byte)j;
        for(int i='0',j=52;i<='9';i++,j++)
            alphaDecode[i] = (byte)j;
        alphaDecode['+'] = 62;
        alphaDecode['/'] = 63;

    }

    /*****************************************
     * encode array byte from 0-255 to base64
     * @param array byte
     * @return array byte
     *****************************************/
    static public byte [] encode (byte [] DataByte) {
        int numberDataBit = DataByte.length * 8;
        int numberDataBitMODULO24 = numberDataBit % 24;
        int numberDataBitBY24 = numberDataBit / 24;
        byte []EncodeData = null;

        if(numberDataBitMODULO24 == 0) EncodeData=new byte[numberDataBitBY24 * 4];
        else EncodeData = new byte[(numberDataBitBY24+1) * 4];
        byte Rshift2_b1,High_b2,Rshift6_b3,b1,b2,b3 ,e2,e3,e4 ;
        int IndexDataByte,IndexEncodeData,i;

        for( i=0;i<numberDataBitBY24;i++) {
            IndexDataByte = 3 * i;
            IndexEncodeData = 4 * i;

            b1=DataByte[IndexDataByte];
            b2=DataByte[IndexDataByte + 1];
            b3=DataByte[IndexDataByte + 2];

            Rshift2_b1 = ((b1&SIGN)==0) ? (byte)(b1>>2) : (byte)(b1>>>2);
            High_b2 = ((b2&SIGN)==0) ? (byte)(b2>>4) : (byte)(b2>>>4);
            Rshift6_b3 = ((b2&SIGN)==0) ? (byte)(b3>>6) : (byte)(b3>>>6);

            e2 = (byte)(((b1&0x3)<<4)|High_b2);
            e3 = (byte)(((b2&0xF)<<2)|Rshift6_b3);
            e4 = (byte)(b3&0x3F);
            EncodeData[IndexEncodeData] = Encodebase64Alphabet[Rshift2_b1];
            EncodeData[IndexEncodeData+1] = Encodebase64Alphabet[e2];
            EncodeData[IndexEncodeData+2] = Encodebase64Alphabet[e3];
            EncodeData[IndexEncodeData+3] = Encodebase64Alphabet[e4];
        }

        IndexDataByte = 3 * i;
        IndexEncodeData = 4 * i;

        if(numberDataBitMODULO24 == 16) {
            b1 = DataByte[IndexDataByte];
            b2 = DataByte[IndexDataByte + 1];
            Rshift2_b1 = ((b1&SIGN)==0)  ? (byte)(b1>>2) : (byte)(b1>>>2);
            High_b2 = ((b2&SIGN)==0) ? (byte)(b2>>4) : (byte)(b2>>>4);
            e2 = (byte)(((b1&0x3)<<4)|High_b2);
            e3 = (byte)((b2&0xF)<<2);
            e4 = PADDING;
            EncodeData[IndexEncodeData]=  Encodebase64Alphabet[Rshift2_b1];
            EncodeData[IndexEncodeData+1]=Encodebase64Alphabet[e2];
            EncodeData[IndexEncodeData+2]=Encodebase64Alphabet[e3];
            EncodeData[IndexEncodeData+3]=e4;
        } else
        if(numberDataBitMODULO24 == 8) {
            b1=DataByte[IndexDataByte];
            Rshift2_b1 = ((b1&SIGN)==0)  ? (byte)(b1>>2) : (byte)(b1>>>2);
            e2 = (byte)((b1&0x3)<<4);
            e3 = PADDING;
            e4 = PADDING;
            EncodeData[IndexEncodeData] =  Encodebase64Alphabet[Rshift2_b1];
            EncodeData[IndexEncodeData+1] = Encodebase64Alphabet[e2];
            EncodeData[IndexEncodeData+2] = e3;
            EncodeData[IndexEncodeData+3] = e4;
        }

        return EncodeData;
    }

    /**************************************
     * encode string from 0-255 to base64
     * @param string
     * @return String
     **************************************/
    static public String encode(String str) {
        return new String(encode(str.getBytes()));
    }

    /**********************************************
     * decode array byte from base64 to char 0-255
     * @param array byte
     * @return array byte
     *********************************************/
    public static byte[] decode(byte []DataByte) {
        if(!isByteInBase64(DataByte)) return null;
        int numberDataBit = DataByte.length * 6;
        int numberGroup_3bit = numberDataBit / 24;
        byte []DecodeData = null;
        byte b1,b2,b3,b4,d1,d2,d3,ch1,ch2,ch3,ch4;
        ch3 = DataByte[DataByte.length-2];
        ch4 = DataByte[DataByte.length-1];

        if(ch3!=PADDING && ch4!=PADDING)
            DecodeData=new byte[numberGroup_3bit*3];
        else if(ch3==PADDING)
            DecodeData=new byte[(numberGroup_3bit*3)-2];
        else if(ch4==PADDING)
            DecodeData=new byte[(numberGroup_3bit*3)-1];

        int decodeIndex,encodeIndex;

        for(int i=0; i<numberGroup_3bit; i++) {
            decodeIndex = 3 * i;
            encodeIndex = 4 * i;
            ch1 = DataByte[encodeIndex];
            ch2 = DataByte[encodeIndex+1];
            ch3 = DataByte[encodeIndex+2];
            ch4 = DataByte[encodeIndex+3];
            b1 = alphaDecode[ch1];
            b2 = alphaDecode[ch2];
            b3 = alphaDecode[ch3];
            b4 = alphaDecode[ch4];

            if(ch3!=PADDING&&ch4!=PADDING) {
                d1 = (byte)((b1<<2)|(b2>>>4));
                d2 = (byte)((b2<<4)|(b3>>2));
                d3 = (byte)((b3<<6)|b4);
                DecodeData[decodeIndex] = d1;
                DecodeData[decodeIndex+1] = d2;
                DecodeData[decodeIndex+2] = d3;
            } else
            if(ch3==PADDING) {// 1 char
                d1 = (byte)((b1<<2)|(b2>>>4));
                DecodeData[decodeIndex] = d1;
            }
            else
            if(ch4==PADDING) { // 2char
                d1 = (byte)((b1<<2)|(b2>>>4));
                d2 = (byte)((b2<<4)|(b3>>2));
                DecodeData[decodeIndex] = d1;
                DecodeData[decodeIndex+1] = d2;
            }
        }

        return DecodeData;
    }

    /**
     *  decode base64 string into characters from 0-255
     *  @param string
     *  return string
     **/
    public static String decode(String str) {
        return new String(decode(str.getBytes()));
    }

    /**
     * check if the byte belong to The Base64 Alphabet
     * @param octet
     * @return bolean value
     **/
    private static boolean isByteInBase64(byte octet) {
        if(octet==PADDING||alphaDecode[octet]!=-1)
            return true;
        else
            return false;
    }
    private static boolean isByteInBase64(byte []arraybyte) {
        int len=arraybyte.length;
        for(int i=0;i<len;i++) {
            if(!isByteInBase64(arraybyte[i]))
                return false;
        }
        return true;
    }
}


'Java' 카테고리의 다른 글

로또번호 랜덤생성 자바소스  (0) 2009.03.17
자바 랜덤 문자열 생성  (0) 2009.03.10
JSTL forEach forToken  (0) 2008.10.02
스타시디키 checksum Java & C# 소스  (0) 2008.09.26
Posted by Main()
Java2009. 3. 10. 14:51

class RandomString {
    private static String pattern = "[a-zA-Z0-9]+$";
    private static StringBuffer returnString = null;

    public static void main(String[] args) {
        RandomString rndStr = new RandomString();

        System.out.println("[랜덤 문자열]");
        System.out.println("숫자 (50자리) : " + rndStr.getString(50,"1"));
        System.out.println("대문자 (16자리) : " + rndStr.getString(16,"A"));
        System.out.println("소문자 (16자리) : " + rndStr.getString(16,"a"));
        System.out.println("대문자 + 숫자 (32자리) : " + rndStr.getString(32,"A1"));
        System.out.println("소문자 + 숫자 (32자리) : " + rndStr.getString(32,"a1"));
        System.out.println("대문자 + 소문자 + 숫자 (32자리) : " + rndStr.getString(32,""));
    }

    //Overload Constructor
    public RandomString() { returnString = new StringBuffer(); }
    public RandomString(int len) { returnString = new StringBuffer(); this.setLength(len); }
    public RandomString(String type) { returnString = new StringBuffer(); this.setType(type); }
    public RandomString(int len, String type) { returnString = new StringBuffer(); this.setLength(len); this.setType(type); }
    public RandomString(String type, int len) { returnString = new StringBuffer(); this.setType(type); this.setLength(len); }

    //Get Random Character
    private static void getRndChar() {
        int r = (int)Math.round(Math.random() * 1000);

        java.util.Random random = new java.util.Random();
        int rnd = random.nextInt(1000);

        if(test(pattern, String.valueOf((char)rnd))) {
            returnString.append((char)rnd);
        } else {
            getRndChar();
        }
    }

    //Regular Express Check Function
    private static boolean test(String pattern, String value) {
        java.util.regex.Pattern p = java.util.regex.Pattern.compile(pattern);
        java.util.regex.Matcher m = p.matcher(value);
        boolean r = m.matches();

        return r;
    }

    //Set String Length
    public void setLength(int len) {
        returnString.setLength(0);
        for(int i=0; i<Math.abs(len); i++) {
            getRndChar();
        }
    }

    //Set String Pattern Type
    public void setType(String type) {
        if(type.equals("1")) pattern = "[0-9]+$";
        else if(type.equals("A")) pattern = "[A-Z]+$";
        else if(type.equals("a")) pattern = "[a-z]+$";
        else if(type.equals("A1")) pattern = "[A-Z0-9]+$";
        else if(type.equals("a1")) pattern = "[a-z0-9]+$";
        else pattern = "[a-zA-Z0-9]+$";
    }

    //Get Random String
    public String getString() {
        return returnString.toString();
    }

    //Overload getString()
    public String getString(int len, String type) {
        this.setType(type);
        this.setLength(len);
        return this.getString();
    }
}

'Java' 카테고리의 다른 글

로또번호 랜덤생성 자바소스  (0) 2009.03.17
Base64 encode & decode in Java  (0) 2009.03.17
JSTL forEach forToken  (0) 2008.10.02
스타시디키 checksum Java & C# 소스  (0) 2008.09.26
Posted by Main()
Java2008. 10. 2. 18:30
forEach는 다음과 같은 속성을 가진다.

items : forEach가 순회할 Collection 개체를 지정한다.
begin : 반복문의 시작값을 설정한다.
end : 반복문의 종료값을 설정한다.
step : 반복문의 증가값을 설정한다.
var : 반복문의 순회시 해당하는 값을 담을 변수를 설정한다.
varStatus : 변수의 상태를 담을 변수를 설정한다.
기본적으로 forEach는 begin 과 end 속성만 설정해주면 동작하며 그 외 속성은 추가적인 옵션이다. 물론 이 두 부분만 설정됬을때는 세부적인 제어가 불가능 하고 step은 기본값으로 1이 작용한다.

 <c:forEach begin="1" end="9">
  <c:out value="foreach" /><br>
 </c:forEach>



begin 속성과 end 속성을 통해 시작값과 종료값을 지정하면 자바의 for문과 마찬가지로 증가값을 지정해 줄 수 있다.

 <c:forEach begin="1" end="9" step="2">
  <c:out value="foreach" /><br>
 </c:forEach>

소스코드에 위와 같이 step을 증가해준다.




위와 같이 step속성을 지정해주면 증가값을 설정할 수 있기 때문에 반복횟수는 5회로 나타난다. 그리고 step 속성은 0보다 작을 수
없으며 0보다 작은 즉, -값으로 설정하게 되면 javax.servlet.ServletException: 'step' <= 0 과 같은 Exception이 발생하게된다. 반복문에서 콜렉션의 사이즈에서 0이 될때까지 순회하는 방식의 사용은 불가능할듯 하다.

var속성은 반복문의 시작값 + 증가값을 변수에 담아둘 수 있는 속성이다. 위 소스에 var를 추가해보면

 <c:forEach begin="1" end="9" step="2" var="x">
  <c:out value="${ x } : foreach" /><br>
 </c:forEach>




varStatus 속성은 var 속성을 통해 변수에 담은 반복문의 값의 상태를 담고있는 변수를 지정한다. 예를 들자면 step은 얼마인지. begin은 몇부터 시작해서 end는 얼마인지 하는등을 변수에 담아둘 수 있다.

 <c:forEach begin="1" end="9" step="2" var="x" varStatus="status">
  <c:out value="${ x } : foreach : ${ status.first }" /><br>
 </c:forEach>

소스에서 사용한 first는 변수가 첫값인가를 부울값으로 반환하는 속성이다.




'Java' 카테고리의 다른 글

로또번호 랜덤생성 자바소스  (0) 2009.03.17
Base64 encode & decode in Java  (0) 2009.03.17
자바 랜덤 문자열 생성  (0) 2009.03.10
스타시디키 checksum Java & C# 소스  (0) 2008.09.26
Posted by Main()
Java2008. 9. 26. 22:11

스타시디키는 Checksum 계산 원리만 알면 무작위 번호를 쉽게 생성할 수 있다.

총 13자리 중 맨 끝 번호를 제외한 12자리는 임의의 수를 생성하고,

이 12자리 숫자들을 이용해 계산식에 대입한 결과를 13자리에 붙이면 완성된다.

 

Checksum 계산식에 대해 알아보자.

 

우선 랜덤으로 12자리 숫자를 만든다.
랜덤으로 구한 12자리 숫자들을 각각 하나씩 아래 공식으로 계산하면 13번째자리의 값이 된다.
랜덤으로 구해진 각 자리수를 n이라 하고, 구해야할 값을 c라고 하면,
 
c = c + (n XOR (2 * c))
 
위 식에서 처음 c의 값은 3을 대입하여 구해진 c값을 누적적용하면서 n마다 12번 반복하고 10으로 나눈 나머지, 즉
 c = c % 10
를 구한 값이 13번째자리 값이 된다.
 
예를 들어 랜덤으로 생성한 12자리 값이
123456789123
이라면,
 
c = 3      + (1 ^ (2 * 3     )) = 10
c = 10     + (2 ^ (2 * 10    )) = 32
c = 32     + (3 ^ (2 * 32    )) = 99
c = 99     + (4 ^ (2 * 99    )) = 293
c = 293    + (5 ^ (2 * 293   )) = 884
c = 884    + (6 ^ (2 * 884   )) = 2658
c = 2658   + (7 ^ (2 * 2658  )) = 7973
c = 7973   + (8 ^ (2 * 7973  )) = 23911
c = 23911  + (9 ^ (2 * 23911 )) = 71726
c = 71726  + (1 ^ (2 * 71726 )) = 215179
c = 215179 + (2 ^ (2 * 215179)) = 645535
c = 645535 + (3 ^ (2 * 645535)) = 1936604
 
이와 같이 구해지고,
최종으로 구한 c가 1936604이므로
c / 10 의 나머지 값을 구하면,
 
c = c % 10 = 4
 
최종값은 4가 되므로 끝에 4를 붙이면,
계산식에 맞는 시디키는 1234567891234가 된다.
하이픈(-)을 추가해서 시디키 모양을 만들면 완성

1234-56789-1234

이렇게 생성된 시디키는 정식 배틀넷은 통과하지 못하고 컴에 인스톨시 확인 통과만 가능하다.

 
아래는 콘솔에 10개씩 생성해 주는 소스를 C#과 Java로 구성해 봤다.

원리 확인 및 학습하는데만 참고 하기 바란다.

  

[Java 소스]

 class CDKeyGenerator {
    public static void main(String[] args) {
        System.out.println("Starcraft CD-Key Generator by WinbotCafe");
        for(int i=0; i<10; i++) {
            System.out.println(generateKey());
        }
    }

    private static String generateKey() {
        String rndKey = "";
        for(int i=0; i<12; i++) {
            rndKey += (int)(Math.random() * 10);
            if(i==3 || i==8) rndKey += "-";
        }
        return rndKey + getChecksum(rndKey);
    }

    private static long getChecksum(String generatedKey) {
        long checksum = 3L;
        for(int i=1; i<=generatedKey.length(); i++) {
            if(i != 5 && i != 11) {
                checksum += (Long.parseLong(generatedKey.substring(i-1,i))^(2*checksum));
            }
        }
        return checksum % 10;
    }
}




[C# 소스]

using System;
using System.Text;

namespace StarcraftCDKey
{
    class CDKeyGenerator
    {
        private static Random rnd = new Random();

        public static void Main(string[] args)
        {
            Console.WriteLine("Starcraft CD-Key Generator by WinbotCafe");

            for(int i=0; i<10; i++)
            {
                Console.WriteLine(GenerateKey());
            }
        }

         private static string GenerateKey()
        {
            string rndKey = "";

            for(int i=0; i<12; i++)
            {
                rndKey += rnd.Next(0,9).ToString();
                if(i==3 || i==8) rndKey += "-";
            }

            return rndKey + GetChecksum(rndKey);
        }

         private static long GetChecksum(string rndKey)
        {
            long checksum = 3L;
            try
            {
                for(int i=1; i<=rndKey.Length; i++)
                {
                    if(i != 5 && i != 11)
                    {
                        checksum += (Convert.ToInt64(rndKey.Substring(i-1,1))^(2*checksum));
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            return checksum % 10;
        }
    }
}

 

'Java' 카테고리의 다른 글

로또번호 랜덤생성 자바소스  (0) 2009.03.17
Base64 encode & decode in Java  (0) 2009.03.17
자바 랜덤 문자열 생성  (0) 2009.03.10
JSTL forEach forToken  (0) 2008.10.02
Posted by Main()