본문 바로가기

쓰기


비주얼베이직에서 사용할 수 있는 커스텀스크립트 Hash 생성 함수입니다.

비주얼베이직에서는 이진 변환과 이진 연산을 할 수 없기 때문에 이진 변환과 연산을 할 수 있게 해주는 함수를 작성하여 만들었습니다.

- 정수를 이진 문자열로 변환하는 함수
- 이진 문자열을 정수로 변환하는 함수
- 이진 문자열을 32비트로 변환하는 함수
- OR 연산 함수
- 32비트 덧셈 연산 함수
- 32비트 좌측 시프트 연산 함수
- 32비트 우측 시프트 연산 함수
- 해쉬 생성 함수


코드를 만들 수 있도록 많은 도움을 주신 Hide_D 님께 깊은 감사를 드립니다....(_ _)

이 코드를 사용한 커스텀스크립트용 번역툴을 만들 예정입니다. 앞으로 한글화를 하시는 분들께 좀 더 편한 작업이 가능해지길 바라겠습니다.

 'Shift-JIS 변환 후 해쉬 계산 함수
Function calcHash(sString As String)

    Dim toolCharset As New ChilkatCharset2 '문자 인코딩 변환 툴 로드
    Dim sTemp As String
    Dim arrByte() As Byte
    
    toolCharset.FromCharset = "unicode" '입력언어에서
    toolCharset.ToCharset = "shift_jis" 'Shift-JIS 로
    
    'Shift-JIS로 변환 수행
    sTemp = toolCharset.ConvertData(sString)
    
    '배열 초기화
    ReDim arrByte(LenB(sTemp))
    
    '8비트씩 배열에 할당
    arrByte() = sTemp
    
    calcHash = CStr(makeHash(arrByte()))
End Function

'해쉬 만들기
Function makeHash(arrInput() As Byte)
    Dim nCount As Integer '카운터
    Dim nTemp As Double '임시 데이터
    Dim nNext As Double '다음 문자값
    
    '변수 초기화
    nCount = 0
    nTemp = 0
    
    '해쉬 만들기
     Do While nCount <= UBound(arrInput)
        'nTemp = ShiftLeft(nTemp, 7) + arrInput(nCount)
        'nTemp = calcOr(((nTemp * 128) Mod (2 ^ 32)), (nTemp / 128)) + arrInput(nCount)
        
        '다음 문자값 설정(128 비트가 넘어가면 256 빼기)
        If arrInput(nCount) < 128 Then
            nNext = arrInput(nCount)
        Else
            nNext = arrInput(nCount) - 256
        End If
        
        '해쉬 생성
        If nCount = 0 Then
            nTemp = verifyPlus(2 ^ 32, nNext)
        Else
            nTemp = verifyPlus(calcOr(ShiftLeft(nTemp, 7), ShiftRight(nTemp, 25)), nNext)
        End If
        nCount = nCount + 1
    Loop
    
    makeHash = nTemp
End Function

'Or 연산 수행
Function calcOr(nInput1 As Double, nInput2 As Double)
    Dim sData1 As String '입력 데이터1
    Dim sData2 As String '입력 데이터2
    Dim nCount As Integer '카운터
    Dim sTemp As String '임시 스티링
    
    '2진 스트링으로 변환
    sData1 = DecToBin(nInput1)
    sData2 = DecToBin(nInput2)
    
    '32비트로 변환
    sData1 = String(32 - Len(sData1), "0") & sData1
    sData2 = String(32 - Len(sData2), "0") & sData2
    
    '32비트 Or 연산 수행(한자리씩 비교)
    For nCount = 1 To 32
        
        If Mid(sData1, nCount, 1) = 1 Or Mid(sData2, nCount, 1) = 1 Then
            sTemp = sTemp + "1"
        Else
            sTemp = sTemp + "0"
        End If
    Next
    
    '리턴 값 출력
    calcOr = BinToDec(sTemp)
    
End Function

'정수값을 이진 문자열로 변환
Function DecToBin(byteDec As Double)
    Dim sBin As String '이진 문자열
    Dim sTemp As String '임시 문자열
    Dim nTemp As Double '임시 값 저장소
    Dim nCount As String '임시 카운터
    
    '임시 저장소에 값 설정
    nTemp = byteDec
    
    '2진 문자열 생성
    Do While nTemp >= 1
        '인수 분해 시작
        sBin = CDbl(Right(CStr(nTemp), 1) Mod 2) & sBin
        nTemp = Int(nTemp / 2)
    Loop
    
    '변수 초기화
    nCount = 1
    
    '리턴 값 출력
    DecToBin = sBin
    
End Function

'이진 문자열을 정수값으로 변환
Function BinToDec(sDec As String)
    Dim nTemp As Double '임시 값 저장소
    Dim nCount As Integer '카운터
    
    '카운터 초기화
    nCount = 0
    
    '2진 문자열 생성
    Do While nCount < Len(sDec)
        '정수값 산출 시작
        nTemp = nTemp + (CDbl(Mid(sDec, Len(sDec) - nCount, 1)) * (2 ^ nCount))
    
        '카운터 증가
        nCount = nCount + 1
    Loop
    
    '리턴 값 출력
    BinToDec = nTemp
End Function

'32비트 좌측 시프트 연산 수행
Function ShiftLeft(nInput As Double, nShift As Integer)
    Dim sData As String '작업용 데이터
    Dim sValue As String '임시 출력 값
    
    '이진 변환
    sData = DecToBin(nInput)
    
    '32비트 변환
    sData = conv32(sData)
    
    '시프트 연산 수행
    sValue = Mid(sData, nShift + 1, Len(sData))
    
    '32비트 변환
    sValue = sValue & String(32 - Len(sValue), "0")
    
    '리턴 값 출력
    ShiftLeft = BinToDec(sValue)
End Function

'32비트 우측 시프트 연산 수행
Function ShiftRight(nInput As Double, nShift As Integer)
    Dim sData As String '작업용 데이터
    Dim sValue As String '임시 출력 값
    
    '이진 변환
    sData = DecToBin(nInput)
    
    '32비트 변환
    sData = conv32(sData)
    
    '시프트 연산 수행
    sValue = Mid(sData, 1, Len(sData) - nShift)
    
    '32비트 변환
    sValue = conv32(sValue)
    
    '리턴 값 출력
    ShiftRight = BinToDec(sValue)
End Function

'이진 32비트 변환기
Function conv32(sInput As String)
    conv32 = String(32 - Len(sInput), "0") & sInput
End Function

'32비트 더하기 함수
Function verifyPlus(nInput1 As Double, nInput2 As Double)
    If nInput1 + nInput2 > 2 ^ 32 Then
        '더해서 32비트를 넘어가면
        verifyPlus = (nInput1 + nInput2) - (2 ^ 32)
    ElseIf nInput1 + nInput2 < 0 Then
        '더해서 0 이하의 값이 나오면
        verifyPlus = (2 ^ 32) - (nInput1 + nInput2)
    Else
        '이상이 없는 경우
        verifyPlus = nInput1 + nInput2
    End If
End Function




분류 :
Talk
조회 수 :
9839
등록일 :
2009.01.05
19:34:30
엮인글 :
https://arallab.hided.net/4203/850/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/4203

Hide_D

2009.01.05
21:46:43
드디어 제가 만들고 싶었지만 VB를 모르는 관계(.........)로 할수 없었던

엑셀 <-> CustomScript

의 꿈의 조합이 이루어 지는군요 +_+

HaruKaze

2009.01.05
22:44:20
넵 일단 생각하고 있는 것은 커스텀스크립트의 데이터를 엑셀에서 불러들여오면서 해쉬를 만들어주는 함수를 넣어주고 실제로 몇 가지 게임의 커스텀스크립트를 통해 테스트하면서 번역 작업에 도움을 줄 수 있는 기능을 넣어보려고 해요.

좋은 아이디어 갖고 계시면 말씀해주세요..^^


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 2008-08-03 155445
229 Archive [플러그인,소스] Korean Duplication Checker 20090115 [2] file Hide_D 2009-01-14 13336
228 Talk ezTransXP의 다이얼로그 파일의 h,cpp가 누락되어있습니다. [1] Hide_D 2009-01-10 12415
227 Archive CustomDic 0.3 20080107 또 오류 OTL [5] file Hide_D 2009-01-07 13954
226 Archive (수정) 하루카제님 요청하신 VB용번역dll입니다. [2] file 호기심맨 2009-01-07 10250
225 Archive SimpleDLL [2] file Hide_D 2009-01-07 12021
224 Archive 번역용 작업툴 v0.2.2 [2] file HaruKaze 2009-01-06 11464
223 OtherFiles CustomDic 090106 쓰레드 에러 도와주세요~ [2] file Hide_D 2009-01-06 14035
222 Talk [질문] 번역플러그인에 관해... [2] 호기심맨 2009-01-06 12730
» Talk VB용 커스텀스크립트 Hash 함수 [2] HaruKaze 2009-01-05 9839
220 Talk 하루카제님 요청하신거 C++로 만들어봤습니다. [3] Hide_D 2009-01-05 10779
219 Talk 비주얼베이직에서의 Hash값 생성 코드 작업 file HaruKaze 2009-01-05 9022
218 Talk CustomDic의 치환문자열에 대해 ( Hide님께) [2] 호기심맨 2009-01-03 11323
217 Talk [질문] CustomDic필터와 FixLine의 셋팅순서 [4] 호기심맨 2009-01-03 11404
216 Talk 관리자님께 '옵션코드 입력'에 관해서 요청~ Hide_D 2009-01-03 9990
215 Archive 아야카시 실행파일 수정 [5] file 아랄 2009-01-02 13874
214 Archive 후킹방식 바꾼 ATCTNR.DLL [5] file 아랄 2008-12-31 11321
213 Talk 디나이코필터 [2] my vagina 2008-12-31 10993
212 Archive [플러그인,소스] DumpText2 테스트버전 081231 [1] file Hide_D 2008-12-31 11059
211 Archive [플러그인] FixLine 테스트버전 081231_2 [1] file Hide_D 2008-12-31 10702
210 Archive [플러그인] FixLine 테스트버전 081230 [4] file Hide_D 2008-12-30 13238