본문 바로가기

쓰기


비주얼베이직에서 사용할 수 있는 커스텀스크립트 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/ffc/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 [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
209 Talk 음 제가 컴퓨터를 못하는 사람이라 뻘글일 수도 있겠지만.. [2] 쥬빌 14389   2008-12-30 2008-12-30 12:14
아랄 트랜스의 장점이 게임상의 대사가 바로 한글로 변환 표기되는 것이라 보는데요. 번역률을 높이기 위해 번역본이 있는 게임들은 ez트랜스가 아닌, 미연시 번역본 text과 연동하여 쓸수는 없을까요? ez와의 연동 구조를 잘 모르겠으나..게임상의 일어를 ez...  
208 Talk 히데님이 말씀하신 테스트파일 [2] file 유르_리샤 11530   2008-12-29 2008-12-30 08:25
 
207 Talk Fixline용 텍스트 파일.... [3] file 처음처럼만 11753   2008-12-29 2008-12-30 09:02
 
206 Talk 필터에 MFC로 모달리스 창을 띄웠을때=ㅅ=; [4] file Hide_D 13934   2008-12-27 2008-12-30 08:29
 
205 Talk FixLine 23일자 파일은 무시설정에 문제가 있는듯하네요 [7] 류제로 15841   2008-12-26 2008-12-30 08:30
이번에 올라온 종말능의를 코드를 입력시켜면서 알게된 것인데 23일자 FixLine 옵션의 무시설정의 서클체크을 사용안함 이외 부분을 체크하고 확인을 누르면 적용은 되는듯하나 다시 옵션창을 열어보면 체크가 사용 안함으로 표시 되어있습니다 20일자로 실행...  
204 Talk 쓰레드를 사용하려고 하는데 제대로 안되네요; [2] Hide_D 10808   2008-12-25 2008-12-26 22:53
음 일단 쓰레드를 사용하는 파일은 CAutoLoad 클래스 하나뿐이구요. CustomDic에 포함됩니다. 5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서 새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데, 애초부터 쓰레드가 동작조차 하...  
203 Talk 기리기리 [] 함수 내부 처리 [1] Hide_D 12463   2008-12-23 2008-12-30 08:49
이것이 , 나의[荷物'ざいさん]의 모두였다. [ ' ] 로 나오는 경우 추가로 루비로 처리되는 모양입니다 이거 추가해둬야겠네요.  
202 Archive [플러그인,소스] FixLine RC2 081223 [4] file Hide_D 17424   2008-12-23 2008-12-30 08:50
 
201 Talk 아아아아앍 cmd /u !!!!!!!!!!!!!!!!!! [1] Hide_D 12323   2008-12-22 2009-01-06 00:47
cmd /? 해서 살펴보고 있는데 /u 플래그가 있었군요 /U 파이프 또는 파일로의 내부 명령어의 출력을 Unicode로 설정합니다. dir /s /b > UniDir.txt 로 했더니 UTF16-LE BOM없음으로 저장되는군요. 옴마야. 왜 모르고있었지  
200 Archive [플러그인,소스] FixLine RC 081222 file Hide_D 12576   2008-12-22 2008-12-22 11:55
 
199 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30
 
198 Archive [플러그인,소스] FixLine 테스트버전 081220_2 [2] file Hide_D 13376   2008-12-20 2008-12-21 08:29
 
197 Talk ezTransXP 플러그인 버그 =ㅅ=?? [2] Hide_D 12427   2008-12-20 2009-01-06 00:47
단순씨 사전 45608개 짜리 버전으로 테스트했을때 「すごい! えらい!! カッコイイ!!! さすが僕らのトライオン!」 이걸 번역하면 「대단해<히)! 대단하다! 멋있어! 과연 우리들의 트라이 온!」 요렇게 나오는데, 아랄트랜스에서 괄호제거 옵션을 ...  
196 Archive [플러그인,소스] FixLine 테스트버전 081219 file Hide_D 11449   2008-12-19 2008-12-19 13:03
 
195 Talk [오류보고]ATcode 버퍼크기 무시 버그 [1] file HaruKaze 12813   2008-12-18 2009-01-06 00:56
 
194 Archive [플러그인,소스] FixLine 테스트버전 081217 file Hide_D 12415   2008-12-17 2008-12-17 23:38
 
193 OtherFiles fixline 테스트 3차 [2] file 처음처럼만 16074   2008-12-16 2008-12-30 08:53
 
192 Talk FixLine 테스트버전 081215 [1] file 그레이 20429   2008-12-16 2008-12-16 16:37
 
191 OtherFiles fixline 테스트 2차 file 처음처럼만 13341   2008-12-16 2008-12-16 15:52
 
190 OtherFiles fixline 테스트 [1] file 처음처럼만 15297   2008-12-16 2008-12-16 15:52