공log/[C#]

[C#] Window Form #1 - File I/O 실습

ming_OoO 2023. 9. 13. 22:46
728x90

실습 내용

: 버튼을 누르면 파일 입출력이 실행되고, 결과를 콘솔 창에 출력하기

 

실행 코드

private void fileOpen() {
	long someValue = 0x123456789ABCDEF0;
	// 파일 스트림 생성
    Stream outStream = new FileStream("a.txt", FileMode.Create);
    // long 형식을 byte 배열로 변환
    byte[] wBytes = BitConverter.GetBytes(someValue);
    // 변환한 byte 배열을 파일 스트림을 통해 파일에 기록
    outStream.Write(wBytes, 0, wBytes.Length);
    // 파일 스트림 닫기
    outStream.Close();
}
    
private string fileClose() {
    byte[] rBytes = new byte[8];
    // 파일 스트림 생성
    Stream inStream = new FileStream("a.txt", FileMode.Open);
    // rBytes의 길이인 8바이트만큼 데이터를 읽어 rBytes에 저장
    inStream.Read(rBytes, 0, rBytes.Length);
    // BitConverter를 이용하여 rBytes에 담겨있는 값을 long형식으로 변환
    long readValue = BitConverter.ToInt64(rBytes, 0);
    // 파일 스트림 닫기
    inStream.Close();
    //변환한 long형식을 문자열로 다시 변환
    string s = readValue.ToString();
    return s;
}

private void fileButton_Click(object sender, EventArgs e) {
	fileOpen();
    string value = fileClose();
    // 콘솔창에 출력
    Debug.Write(value);
}

BitConverter.GetBytes(someValue) : 입력된 'someValue' 변수의 바이트 표현을 리턴. ToInt64(rBytes, 0)의 경우 바이트 배열의 데이터를 long 형식으로 변환하여 저장. 0은 배열에서 변환을 시작할 인덱스를 나타

 

Stream.Write/Read(Bytes, 0, Bytes.Length) : Stream 스트림에 Bytes 배열의 데이터를 쓰거나 읽고, 0부터 배열의 끝까지 (Bytes.Length 만큼) 데이터를 쓰거나 도록 지정

 

실행 결과



Q. a.txt를 열었을 때 다음과 같이 보이는 이유?

기본으로 ASCII 문자 집합을 사용하여 파일에 데이터를 쓸 수 있다. 하지만 이 경우, long 값을 바이트 배열로 변환하면 각 바이트에 해당하는 숫자 값이 들어 있다. 즉,  ASCII 문자가 아닌 바이트 시퀀스가 파일에 저장. 이 값들은 ASCII 문자 집합에서는 인코딩되지 않은 값이므로 텍스트 편집기에서 올바르게 해석되지 않음. 따라서 파일을 텍스트 편집기로 열면 이상한 문자가 표시될 수 있다.

 

바이너리 에디터로 파일을 열어본다면

16진수 123456789ABCDEF0 를 바이트 단위로 쪼개면 12, 34, 56, 78, 9A, BC, DE, F0
Q. 왜 거꾸로 기록되어있는가?
컴퓨터 아키텍쳐가 데이터의 낮은 주소부터 기록하는 리틀 엔디안(Little Endian)방식이기 때문에 나타난 현상
빅 엔디안(Big-endian)
- 빅 엔디안 방식은 낮은 주소에 데이터의 높은 바이트(MSB : Most Significant Byte)부터 저장하는 방식이다. 이 방식은 평소 사람이 사용하는 선형 방식과 같아 메모리에 저장된 순서 그대로 읽을 수 있다.
리틀 엔디안(Little-endian)
- 리틀 엔디안 방식은 낮은 주소에 데이터의 낮은 바이트(LSB : Least Significant Byte)를 저장하는 방식이다. 이 방식은 평소 사람이 숫자를 사용하는 선형 방식과 반대로 거꾸로 읽어야 한다.

두 방법은 서로 다른 아키텍처에서 공존하고 있다. 그러나 x86 아키텍처가 리틀 엔디안을 쓰기 때문에 오늘날 x86 아키텍처를 사용하는 대부분의 데스크톱 컴퓨터는 리틀 엔디언 방식을 사용한다. 반면, 네트워크에서는 주소를 주로 빅 엔디언으로 쓰는데, 역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문이다. 

 

728x90

'공log > [C#]' 카테고리의 다른 글

[C#] Window Form #1 - File I/O  (0) 2023.09.13