레지스트리 값 형식
레지스트리 값은 문자열 값 또는 정수 값과 같은 여러 형식 중 하나로 데이터를 저장할 수 있습니다. 예를 들어 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
저장됩니다.
이러한 용어는 조나단 스위프트의 풍자 소설 걸리버의 여행에 대한 가벼운 문화적 참조입니다.