본문 바로가기

쓰기


비주얼베이직에서 사용할 수 있는 커스텀스크립트 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/a51/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 [필독] 테스트필터 사용시 주의사항 라파에 155440   2008-08-03 2008-12-16 00:03
204 Talk ATCTNR에다가 Python만 갖다 붙여도...? [1] Hide_D 280   2016-01-11 2016-01-12 01:30
ATCTNR에 몇가지 버그는 좀 있지만 이거 좀 보완하고, 인젝터 세팅가능하게 한다음에 ATCTNR + ProtocolBuffer(+gRPC) + Python 3 정도로 해서 묶으면, 꽤 재미있는 물건이 나오지 않을까 생각해봅니다 ㅇㅇ 이쪽은 Standalone으로 해볼만할 것 같기도 하고...  
203 Talk 1빠!!! [1] 아랄 19435   2008-07-08 2011-06-28 01:25
옹예~  
202 Talk 2등 ~ [3] 앙마vv 15977   2008-07-08 2008-09-17 00:31
2등 입니다 ㅋㅋㅋㅋ ........... 뭐... 뭐 어쩌라는거지 .......... 그나저나 이곳 뭐하는곳 ??????? ㄷㄷㄷ;;  
201 Talk 브라반 대체 뭐가 문제인걸까요 orz Hide_D 15988   2008-07-08 2008-07-08 13:54
추출된 스크립트도 문제가 없고 소스를 분석해봐도 문제는 없는데 =ㅅ=;;;  
200 Talk [버그 보고?]브라반 드디어 원인을 찾았습니다. orz [6] Hide_D 15593   2008-07-08 2008-07-09 16:23
엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉엉 0x3010 0x3011이용해서 대사 처리하는 녀석들을 찾아보았더니 http://aralgood.com/zbxe/26860 루이는 토모를 부른다. 가 있더군요. 요건 그 일부분! ------------------------------------------------------...  
199 Talk [질문] HKCU/Software/AralGood/M2WAddr ? [3] whoami 14960   2008-07-08 2008-07-08 19:14
// CATCodeMgr::Init(ATCodeMgr.cpp) 중에서... // 어플로케일 관련 함수 m_sTextFunc.pfnOrigMultiByteToWideChar = (PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("M2WAddr")); m_sTextFunc.pfnOri...  
198 Talk AGTH의 /L과 AT의 /L [1] Hide_D 17165   2008-07-08 2008-08-12 00:50
AT에서는 어플로케일 메시지가 뜨는데, AGTH에서는 그게 안뜬단 말이죠? 자체 구현인가...하면, 어플로케일이 없으면 /L옵션이 안먹는걸로 봐선 똑같이 어플로케일을 사용하는 것일텐데.. 이놈들은 어떻게 어플로케일 메시지가 안뜨게 하는걸까요?  
197 Talk 기리기리 번역... [8] 나는누구인감? 18994   2008-07-09 2008-07-10 13:34
루이토모를 하다보니 대사창이 아닌곳에 텍스트를 뿌리는 장면이 있더군요. 초반에 채팅창이 나오는데 그 채팅창이 이미지로 되어있는줄 알았는데 텍스트였습니다... 스크립트 열어보니 해당부분 번역되어 있더군요. 루이토모 외에 Temptation-Naked 2도 이런...  
196 Talk 일단 기리기리 미 번역 파트(선택지) 보고? file Hide_D 14675   2008-07-10 2008-07-10 00:34
 
195 Talk RealLive 게임 목록 Hide_D 16886   2008-07-10 2009-01-06 01:27
자게에도 써놨지만, 원래 있어야 할 위치는 여기인것 같아서.. http://www.product.co.jp/?enter=1&page=1 商品?分를 PC게임 키네틱노벨 로 맞추면 됩니다.  
194 Talk 어제 말씀드렸던것... 알아냈습니다. file 나는누구인감? 14332   2008-07-10 2008-07-10 14:17
 
193 Talk 줄 바꿈을 n으로 하는 게임에서 벽뚫기 방지 해결책 [1] Hide_D 15082   2008-07-12 2008-07-12 18:09
http://aralgood.com/zbxe/33245 여기 스샷보고 생각난건데, 자릿수를 지정해 주고, n을 새로 먹여주면 벽뚫기가 줄어들지 않을까요.  
192 Talk 아 이런 클라나드 [1] file my Vagina 11070   2008-07-13 2009-01-06 01:00
 
191 Talk 귀차니즘 발동 Hide_D 10755   2008-07-18 2009-01-06 01:00
현재 프로그래밍을 공부하면서 플러그인을 만드는 관계로 진척속도가 좀 많이 느립니다 =ㅅ=;; 그냥 플러그인 0.1 내놓고, 나중에 마저 개발해야겠네요. 데굴데굴  
190 Talk whoami님 [3] Hide_D 9072   2008-07-18 2008-07-18 21:25
아래에 만든 플러그인이 에러가 납니다. 맨 처음에 만들었던 개발모드가 풀유니코드로 작성되어있고, 이녀석이 그냥 돌릴땐 잘 돌아가길래 그냥 Ctrl+C, Ctrl+V 해주고, 위 아래에 Ansi -> Unicode Unicode -> Ansi만 붙여넣은 거라 아무래도 변환부에 문제가 ...  
189 Talk 아무나 rc 파일 좀 만들어 주실분 안계세요? [2] Hide_D 12831   2008-07-19 2008-07-19 22:41
대충 이렇게 생겨먹었습니다. ┌──────────────────────┐│                      ││ □사용자사전사용             ││  경로 - ○ 게임폴더ATDataCustomDic.txt ││      ○ 사용자정의 |       |...|││    ...  
188 Talk http svn을 운용하는건 어떨까요? [3] 아랄 8950   2008-07-20 2009-01-06 01:35
몇몇 개발자 분들께서 열악한 버전관리 환경 속에서도 플러그인을 개발하시는데 조금이나마 도움이 되고싶네요 소스는 svn상으로 함께 공유하며 자발적으로 개선해 나갔으면 하는데요 현재 기존의 플러그인에서 분기되거나 또는 아랄트랜스 기본 기능에 넣고 ...  
187 Talk 역시 번역 플러그인 테스트용으론 Hide_D 11417   2008-07-21 2008-07-21 12:50
체험판이 최고군요 +_+ 사쿠라슈트랏세웹 체험판 설치해놓고 전에 관리자님이 올리신 코드로 잘 돌아가니 이걸로 테스트 해야겠군요  
186 Talk 어? ezTransXP 플러그인을 분석하다 생각난건데 [1] Hide_D 8162   2008-07-22 2008-11-22 16:38
이 플러그인에서는 전각 기호는 다른 코드로 치환해 뒀다가 다시 전각 기호로 되돌려주는데, 반각기호는 처리법이 약~간 특이합니다. 1. 원문에 ()<>{}가 없고, 번역문에 ()<>{}가 있으면, ()<>{}와 그 안의 내용을 날립니다. 2. 원문에 ()<>{}가 있고, 번역문...  
185 Talk Vmware 가상 일윈으로 즐기기.. [3] file ㅌㅌ 14029   2008-07-23 2008-07-24 21:11