레지스트리 값 형식

레지스트리 값은 문자열 값 또는 정수 값과 같은 여러 형식 중 하나로 데이터를 저장할 수 있습니다. 예를 들어 RegSetValueEx 함수를 호출하여 레지스트리 값에 데이터를 저장하는 경우 아래 표의 형식 중 하나를 지정하여 저장되는 데이터 형식을 나타낼 수 있습니다. 레지스트리 값을 검색할 때 RegQueryValueEx 와 같은 함수는 이러한 형식을 사용하여 검색된 데이터 형식을 나타냅니다.

다음 레지스트리 값 형식은 헤더 파일에 정의 winnt.h 되어 있습니다.

형식
REG_BINARY 모든 형태의 이진 데이터입니다.
REG_DWORD 32비트 숫자입니다.
REG_DWORD_LITTLE_ENDIAN little-endian 형식의 32비트 숫자입니다. Windows는 little-endian 컴퓨터 아키텍처에서 실행되도록 설계되었습니다. 따라서 이 값은 Windows 헤더 파일에서와 같이 REG_DWORD 정의됩니다.
REG_DWORD_BIG_ENDIAN big-endian 형식의 32비트 숫자입니다. 일부 UNIX 시스템은 빅 엔드 아키텍처를 지원합니다.
REG_EXPAND_SZ 환경 변수에 대한 확장되지 않은 참조(예: %PATH%)를 포함하는 null로 종료된 문자열입니다. 유니코드 또는 ANSI 함수를 사용하는지에 따라 유니코드 또는 ANSI 문자열입니다. 환경 변수 참조를 확장하려면 ExpandEnvironmentStrings 함수를 사용합니다.
REG_LINK REG_OPTION_CREATE_LINKRegCreateKeyEx 함수를 호출하여 만든 기호 링크의 대상 경로를 포함하는 null로 종료된 유니코드 문자열입니다.
REG_MULTI_SZ 빈 문자열(\0)에 의해 종료되는 null로 끝나는 문자열 시퀀스입니다. 예제는 입니다 String1\0String2\0String3\0LastString\0\0. 첫 번째 \0 문자열은 첫 번째 문자열을 종료하고, 두 번째 문자열은 마지막 \0 문자열을 종료하고, 마지막 \0 문자열은 시퀀스를 종료합니다. 최종 종결자는 문자열의 길이로 계산되어야 합니다.
REG_NONE 정의된 값 형식이 없습니다.
REG_QWORD 64비트 숫자입니다.
REG_QWORD_LITTLE_ENDIAN little-endian 형식의 64비트 숫자입니다. Windows는 little-endian 컴퓨터 아키텍처에서 실행되도록 설계되었습니다. 따라서 이 값은 Windows 헤더 파일에서와 같이 REG_QWORD 정의됩니다.
REG_SZ null로 끝나는 문자열입니다. 유니코드 또는 ANSI 함수를 사용하는지에 따라 유니코드 또는 ANSI 문자열입니다.

문자열 값

데이터에 , REG_MULTI_SZ또는 REG_EXPAND_SZ 형식이 REG_SZ있는 경우 문자열이 적절한 종료 null 문자와 함께 저장되지 않았을 수 있습니다. 따라서 레지스트리에서 문자열을 읽을 때 문자열을 사용하기 전에 문자열이 올바르게 종료되었는지 확인해야 합니다. 그렇지 않으면 버퍼를 덮어쓸 수 있습니다. 문자열에는 REG_MULTI_SZ 두 개의 종료 null 문자가 있어야 합니다.

레지스트리에 문자열을 쓸 때 종결 null 문자(\0)를 포함하여 문자열의 길이를 지정해야 합니다. 일반적인 오류는 함수를 strlen 사용하여 문자열의 길이를 결정하지만 종료 null을 계산하지 않고 문자열의 문자 수만 반환한다는 사실을 strlen 잊어버리는 것입니다. 따라서 를 사용하여 문자열의 길이를 계산해야 합니다. strlen(string) + 1

문자열은 REG_MULTI_SZ 길이가 0인 문자열로 끝납니다. 따라서 시퀀스에 길이가 0인 문자열을 포함할 수 없습니다. 빈 시퀀스는 다음과 같이 정의됩니다. \0

다음 예제에서는 문자열을 REG_MULTI_SZ 안내합니다.

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void SampleSzz(PTSTR pszz)
{
   _tprintf(_TEXT("\tBegin multi-sz string\n"));
   while (*pszz) 
   {
      _tprintf(_TEXT("\t\t%s\n"), pszz);
      pszz = pszz + _tcslen(pszz) + 1;
   }
   _tprintf(_TEXT("\tEnd multi-sz\n"));
}

int __cdecl main(int argc, char **argv)
{
   // Because the compiler adds a \0 at the end of quoted strings, 
   // there are two \0 terminators at the end. 

   _tprintf(_TEXT("Conventional multi-sz string:\n"));  
   SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0"));

   _tprintf(_TEXT("\nTest case with no strings:\n"));  
   SampleSzz(_TEXT(""));

   return 0;
}

바이트 형식

little-endian 형식에서 다중 바이트 값은 가장 낮은 바이트(작은 끝)에서 가장 높은 바이트까지 메모리에 저장됩니다. 예를 들어 값 0x12345678 은 little-endian 형식으로 0x78 0x56 0x34 0x12 저장됩니다.

big-endian 형식에서 다중 바이트 값은 가장 높은 바이트(빅 엔드)에서 가장 낮은 바이트까지 메모리에 저장됩니다. 예를 들어 값 0x12345678 은 big-endian 형식으로 0x12 0x34 0x56 0x78 저장됩니다.

이러한 용어는 조나단 스위프트의 풍자 소설 걸리버의 여행에 대한 가벼운 문화적 참조입니다.