본문 바로가기

쓰기


비주얼베이직에서 사용할 수 있는 커스텀스크립트 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
조회 수 :
9835
등록일 :
2009.01.05
19:34:30
엮인글 :
https://arallab.hided.net/4203/0c7/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
번호 제목 글쓴이 조회 수 추천 수sort 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155441   2008-08-03 2008-12-16 00:03
429 Archive [플러그인] OutRuby 임시 버전 20081012_2 [7] file Hide_D 28334   2008-10-12 2015-07-14 15:18
 
428 Talk ATCTNR에다가 Python만 갖다 붙여도...? [1] Hide_D 280   2016-01-11 2016-01-12 01:30
ATCTNR에 몇가지 버그는 좀 있지만 이거 좀 보완하고, 인젝터 세팅가능하게 한다음에 ATCTNR + ProtocolBuffer(+gRPC) + Python 3 정도로 해서 묶으면, 꽤 재미있는 물건이 나오지 않을까 생각해봅니다 ㅇㅇ 이쪽은 Standalone으로 해볼만할 것 같기도 하고...  
427 Archive [본체] AralTrans.exe ATCTNR.DLL 150622 [4] file TwoComet 536   2015-06-22 2015-07-25 00:12
 
426 Archive [플러그인,소스] KoFilter 테스트 버전 20081118 file whoami 15552   2008-11-18 2008-11-18 23:37
 
425 Talk 아랄 트랜스 github/svn [6] ka7713 736   2018-12-26 2018-12-30 17:26
안녕하세요. 아랄트랜스 0.2/0.3 업데이트가 되지 않는 것이 안타까운데, github나 다른 곳으로 올려주실 생각은 없으신지요. 큰 도움은 안되더라도 조금이나마 기여하고 싶네요.  
424 Archive [플러그인] N eueGoogleTrans 180202 [5] file oscarw854 1417   2018-02-02 2018-02-03 17:45
 
423 Talk VB.NET에서 ezTransXP.dll사용하는 방법은 없나요? [1] R2D2 360   2016-06-14 2018-06-20 14:44
vb.net에서 MFC dll을 써서 이지트랜스로 번역해서 결과물을 가져오고 싶습니다. 그런데 아무리찾아봐도 방법을 모르겠습니다. Imports System.Runtime.InteropServices  Private Declare Fu*nction Translate Lib "ezTransXP.dll" (ByRef cszJapanese As Stri...  
422 Talk UTF-8이나 유니코드 원활한 필터처리를 위해 생각해봤는데 [5] Wales 622   2014-06-16 2014-07-29 16:39
Translate함수에 포함된 필터 전후처리를 따로 빼서 원문 전환전과 번역후에 필터 처리를 하도록 하는건데 문제는 필터들 전부 멀티바이트 중점으로 만들어지다 보니 필터 전부를 손봐야 하는 상황이 오는군요. 그래서 일단 보류중...  
421 Archive [플러그인,소스] ATCode 테스트 버전 140322 [4] file whoami 870   2014-03-22 2014-06-15 07:51
 
420 Archive [플러그인] ATCode 150531 file TwoComet 472   2015-05-31 2015-06-07 21:30
 
419 Talk aralgood.com 도메인 부활... [7] whoami 567   2014-03-02 2014-03-17 22:48
혹시나 하고 매일 한번씩 체크하곤 하는데.. 오늘 보니 도메인이 부활했군요! 아랄님이 체크하시고 부활시키셨나? 어쨌든 그에 따라 자동업데이트도 부활하고 좋군요. 혹시 아랄님이나 Hide_D군님 보시면.. 제로보드 업데이트 하실 생각 없으신가요? 꽤 오래된...  
418 Archive [플러그인,소스] ATCode, KoFilter2 테스트 버전 140301 [3] file whoami 439   2014-03-01 2014-03-02 11:59
 
417 Talk 이지트랜스 플러그인 Ehnd 제작자입니다. [6] kiereh 3439   2014-02-27 2014-03-01 17:59
에그헤드의 필터 기능을 타 써드파티 프로그램에서도 사용할 수 있게 하자는 발상으로 이지트랜스 플러그인인 Ehnd를 제작하게 되었습니다. 플러그인이라고 하는 이유는 Proxy DLL 기법을 이용해 구현하였고 (Ehnd의 DLL 이름은 J2KEngine.dll, 기존 이지트랜...  
416 Archive [플러그인,소스] ATCode 테스트 버전 140227 file whoami 456   2014-02-27 2014-02-27 01:59
 
415 Talk 아랄트랜스 0.2 소스 bitbucket 으로 올려놨습니다. [7] whoami 2832   2014-02-18 2018-12-27 18:27
구글코드 SVN 에 무슨 일이 생겼는지 몰라서 일단 백업삼아 bitbucket 에 repositiry 하나 잡고 소스를 올렸습니다. 아무래도 옛날 SVN과 인터페이스가 비슷해서 (TortoiseHg) 편한 Mercurial 로 세팅했고.. 공개로 일단 해놓기는 했는데.. 어차피 개발진이 몇...  
414 Archive [플러그인] atcode 비정상 문자 출력 픽스 file Wales 201   2014-02-16 2014-02-16 21:08
 
413 Talk 아랄트랜스 0.2 구글코드 svn 밴당했나요? whoami 2537   2014-02-15 2014-02-15 22:54
오랫만입니다... ^^ 새해 복 많이 받으세요.. 이미 늦었나. 아래 Wales 님이 코드수정을 몇 개 하신 것을 보고 오랫만에 svn 업데이트를 하려고 하니 에러가 뜨더군요. 그래서 구글코드 들어가 보니 프로젝트가 사라졌네요? 동일한 이름의 프로젝트를 만들려고...  
412 Talk 엔드 아랄호환 문제를 모두 수정했습니다 [2] kiereh 494   2014-04-28 2014-04-30 01:25
http://www.eroha.net/%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8/%ec%97%94%eb%93%9c/ 오늘자 버전 (140428)으로 엔드와 아랄트랜스간의 호환 문제가 수정되었습니다. 멀티쓰레드로 번역문을 막 쏘면 문자열 포인터가 튀면서 잘못된 참조를 하던 문제, %가 들어갈...  
411 Archive [플러그인,소스] KiriKiri 테스트 버전 [1] file 미소미소 711   2014-04-17 2015-02-23 21:38
 
410 Talk 요 며칠간 아랄트랜스 사이트가 인기군요. [2] file whoami 926   2014-04-18 2014-04-28 16:06