글 수 429
비주얼베이직에서 사용할 수 있는 커스텀스크립트 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
엑셀 <-> CustomScript
의 꿈의 조합이 이루어 지는군요 +_+