|
[카테고리:] Visual Basic
string을 byte의 배열에 넣고 싶습니다.
씨만 쓰다가 갑자기 비베로 개발을 하게 되었는데요..
첨써보는 비베라서 혼자서 난리치다가 도저히 안되겠어서 이렇게 써봅니다.
고수님들 제발 저에게 서광을 비춰주세요~
string을 byte의 배열에 넣고 싶습니다.
sData에 “ABCDE”를 넣으면 잘 들어가는데
sData에 “안녕하세요”를 넣으면 에러가 나는 이유는 도데체 왜일까요?
하루종일 이것때매 말썽이네요.ㅠ.ㅠ
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim sData As String
Dim arrayB(256) As Byte
Dim tmText As String
sData = “안녕하세요”
‘sData = “ABCDE”
Dim i As Integer
For i = 1 To Len(sData)
tmText = Mid(sData, i, 1)
arrayB(i) = CByte(Asc(tmText))
Next i
End Sub
* 답변
Visual Basic 강좌와 팁에서 “바이트배열”로 검색해 보셨더라면… ^^;
—————————————-
Dim buf() as Byte buf = StrConv(“가”, vbFromUnicode)
—————————————-
*답변
예. vb에서는 한글 2바이트가 통째로 1개로 취급되기 때문에 그렇습니다.
코드 보시면, Mid 함수를 써서 하나를 잘라낸 다음에, 아스키값으로 넣고 계시죠.
여기서 Mid 함수를 쓰면 tmText에는 ‘안’의 반쪽이 아닌 ‘안’이 들어가게 됩니다. (바이트로 따지면 2바이트)
아래 코드 실행해보세요. form만 하나 놓으시고.
Private Sub Form_Load()
Dim bbb() As Byte
bbb = StrConv(“abc”, vbFromUnicode)
‘bbb = StrConv(“안녕하세요”, vbFromUnicode)
Dim idxTo As Long
idxTo = UBound(bbb)
Dim idxByte As Long
For idxByte = 0 To idxTo
Debug.Print bbb(idxByte)
Next idxByte
Erase bbb
End Sub
디버그창에 바이트 배열에 들어있는 값이 나오는데요(물론 아스키값으로)
strconv는 두번째 인수에 따라서 첫번째 인수에 있는 내용을 여러가지로 변환할 수 있습니다.
strconv(vb스트링, vbfromunicode) 라고 하면 vb스트링을 바이트 배열로 담을 수 있습니다. (되는지 몰랐는데, 되네요-_-;;)
거꾸로 strconv(바이트배열, vbunicode) 라고 하면 c에서 취급하는 바이트 배열 문자열(char[] 같은)을 vb스트링으로 변환할 수 있고요.
아실지도 모르지만, 첨이라고 하셔서 좀더 설명을 드리면.
vb에서 배열 하한이 무조건 0인 것은 아니지만, strconv 에서 반환하는 배열은 0베이스가 되고요.
변수를 동적으로 잡아놓으시면(dim bbb() as byte에서처럼 배열 개수를 적어주지 않음), 반환값에 따라서 자동으로 늘어납니다.
Ubound 함수는 배열의 상한 인덱스를 반환합니다-만, 위에서처럼 루프를 돌릴 때에는 ubound 값을 변수에 담은 후에 쓰세요.
저도 데브에서 본건데, ubound 함수 속도가 느리다고 하네요. 배열 아이템이 많을 때는 상당한 부하가! (-0-)
음. vb에서 동적 배열은 erase 배열이름 해서 지울 수 있습니다. ^^*
문자열을 16진수처리
Dim linebuffer As String Dim sHex As String Dim i As Integer
sHex = “” linebuffer = “Hello” For i = 1 To Len(linebuffer) sHex = sHex & Hex(Asc(Mid(linebuffer, i, 1))) Next i
Debug.Print sHex |
초급자를 위한 파일 입출력 실무
이번 강좌에서는 이진파일(Binary File)의 예제를 하나 소개할까 합니다
#1강에서도 설명을 드렸다시피 이진파일은 라인단위가 아닌 블럭단위로 입출력을 하게 됩니다
또한 읽거나 쓴만큼 자동으로 다음 위치를 가리키게 됩니다
1. 프로그램을 실행 시키면 아래와 같은 화면이 보이게 됩니다
여기서 <파일 생성> 버튼을 누르게 되면 현재 위치에 1024바이트의 NEW.BIN 파일이 만들어 지며
파일은 모두 “X”로 채워지게 됩니다
또한 100 번째 위치에 있는 값을 읽어와서 출력을 해보고 100 번째 있는 값을 공백문자(” “)로 바꾸어 보겠습니다
Option Explicit
——————————————————————————————–
<프로그램 종료> 버튼을 눌렀을때 실행됩니다
Private Sub cmd종료_Click()
End
End Sub
——————————————————————————————–
<파일 생성> 버튼을 누르면 실행이 됩니다
Private Sub cmd파일생성_Click()
Dim i%
Dim ReadByte As Byte
현재 경로에서 NET.BIN 파일을 이진형태로 엽니다. 또한 없으면 자동으로 생성이 됩니다
Open App.Path & “\NEW.BIN” For Binary As #1
For i = 1 To 1024 1024 개를 파일에 저장합니다
Put #1, , “X” 파일의 현재 위치에 “X”를 저장합니다. 두번째 값을 생략한 이유는… 파일을 처음 열면 자동으로
1을 가리키기 때문
Next i 아래에 있는 [그림-1]을 보시면 실제 파일에 어떻게 들어가 있는지 확인을 할 수 있습니다
Get #1, 100, ReadByte 파일에서 100 번째 위치한 값을 ReadByte변수로 읽어들입니다
MsgBox Hex(ReadByte) 읽어들인 값을 출력합니다 (16진수로 출력)
Put #1, 100, ” ” 100 번째 위치에 공백문자(” “)를 출력한다
아래에 있는 [그림-2]을 보시면 실제 파일에 어떻게 들어가 있는지 확인을 할 수 있습니다
Get #1, 100, ReadByte 100 번째 위치에 있는 값을 읽는다
MsgBox Hex(ReadByte)
Close #1
MsgBox “처리가 완료되었습니다”, vbInformation, “결과”
End Sub
——————————————————————————————–
Private Sub Form_Load()
폼을 회면의 중앙에 출력한다 (함수는 모듈에 선언되어 있음)
Call CenterForm(Me)
End Sub
[그림-1]
[그림-2]