인프런 커뮤니티 질문&답변

Rein님의 프로필 이미지
Rein

작성한 질문수

독하게 되새기는 C 프로그래밍

Hex Editor를 이용한 다국어 번역 관련 질문입니다

해결된 질문

작성

·

48

·

수정됨

0

"문자(배)열 상수는 어디에 저장되는가?" 강의에서 마지막에 Hex Editor로 exe 파일의 static 영역에 있는 문자열 리터럴을 강제로 바꿔서 다국어 지원을 하게 했다는 이야기를 하셨는데요, 그 부분과 관련해 궁금한 점이 생겼습니다.

 

응용프로그램에서 static 영역의 메모리를 수정할 수는 있겠지만, 각 크기가 정해져있지 않나요? 예를 들어서 "Hello"를 "안녕하세요"로 변경하기에는 5 byte를 10 byte로 변경해야 한다는 점에서 의문이 들었습니다. 이 경우 문자열 리터럴의 메모리 주소가 밀려나거나, 다른 문자열을 침범하거나 하는 문제가 발생할 수 있지 않을까요?

 

예를 들어 원래 캐릭터 A가 "Hello"라고 출력 후, B 캐릭터가 "Oh, Hi!" 라고 해야 할 때 static 영역에 있는 메모리가 가지는 값은 다음과 같을거라 생각합니다.

H e l l o \0 O h , H i ! \ 0

 

이 부분을 강제로 에디터로 고쳐서

 

안 녕 하 세 요 \0 응 , 안 녕 ! \ 0

 

라고 변경했다고 가정하겠습니다.

 

원래 프로그램에서는 기존에는 5byte의 Hello를 출력할겁니다. 그러나 "안녕하세요"는 10byte이므로 "안녕" 까지만 출력이 될 수 있을거라 생각합니다.

또는 A가 "안녕"까지 출력 후 계속 다음 메모리 주소를 찾아서 출력해 B가 "하세요" 라고 하는 문제가 있을 수도 있을 것 같습니다.

 

그러나 그럼에도 다국어 지원이 가능했다고 하는데, 그렇다면 이와 같은 바이트 차이 문제 등을 어떻게 해결했는지 궁금합니다. Null Character \0 을 만날때까지 출력하기 때문에 문제가 없었나 싶기도 하네요.

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

Visual Studio 같은 도구를 이용해 .exe 파일의 리소스 영역만 열어 편집하는 것이 가능합니다. 생각하시는 문제가 발생할 수 있기 때문에 보통은 문자열, GUI화면 요소 등 소위 리소스 영역을 몽땅 새로 제작해 재편집하는 방식으로 처리합니다.

제가 수업에서 보여드린 방식은 그것이 가능하다는 것만 보인 정도이며 일반적으로 활용되는 방식은 아닙니다. 결론! 실행파일(PE 형식 파일)도 얼마든지 수정 할 수 있습니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. Rein님.

질문하신 내용은 Hex Editor로 문자열 리터럴을 변경할 때 발생할 수 있는 용량 문제와 그에 따른 영향에 관한 것입니다. 아주 중요한 부분을 짚으셨는데요, 문자열 리터럴을 바꾸는 과정에서 용량이 달라질 경우의 문제에 대해 잘 이해하고 계신 것 같습니다.

이와 관련된 유사한 질문과 답변이 인프런 질문 게시판에 있습니다. 아래 링크를 통해 확인해주시기 바랍니다:

  1. 정수형태 변수 메모리상 확인방법 및 단순 대입 관련 문의

    • 이 답변에서는 일반 변수와 배열의 메모리 주소와 관련된 내용을 다룹니다. 변수의 메모리 주소를 다룰 때 발생할 수 있는 문제들을 이해하는 데 도움이 될 것입니다.
  2. 1강-문자(배)열 상수는 어디에 저장되는가? 관련 질문

    • 이 답변에서는 동일한 문자열이 메모리에 저장되는 방식과 해당 메모리 영역이 어떻게 관리되는지에 대해 다룬 내용입니다. Rein님의 질문과 아주 밀접한 관련이 있습니다.
  3. 강의 “16진수 표기가 사용되는 예” 에서의 질문

    • 이 질문에서는 메모리상에 표시되는 16진수 값들에 관한 설명이 포함됩니다. 메모리 주소와 데이터 값 간의 대응 관계를 이해하는 데 도움이 될 것입니다.

추가적으로, 기본적으로 생각할 수 있는 한 가지 방법은 문자열의 길이 차이를 고려해서 새로운 문자열을 삽입할 수 있는 충분한 공간이 확보된 영역에 저장하는 것입니다. 만약 적절한 공간이 없다면, 프로그램 자체의 코드나 데이터 배열을 부정확하게 변경하면 문제가 발생할 수 있습니다. 이 때문에 일반적으로 점진적 또는 반복적으로 크기를 관리할 필요가 있습니다.

아니면 새로운 번역 문자열을 위한 충분한 버퍼 공간을 미리 할당해 두고, 각 언어 번역을 위한 포인터나 참조를 조정하는 방법도 있을 수 있습니다.

해당 과정은 정확히 구현되지 않으면 매우 복잡해지고 오류의 가능성이 있기 때문에, 적절히 계획하고 검토해야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Rein님의 프로필 이미지
Rein

작성한 질문수

질문하기