Byte to String
1. Encoding 클래스 사용 ( UTF8, ASCII, Unicode)
System.Text.Encoding 클래스는 다양한 인코딩 방식을 제공합니다. UTF8, ASCII, Unicode 등을 사용하여 byte 배열을 문자열로 변환할 수 있습니다.
특징
- 텍스트 데이터를 저장할 때 주로 사용한다.
byte[] bytes = { 72, 101, 108, 108, 111 };
string str = Encoding.UTF8.GetString(bytes);
Console.WriteLine(str); // 출력: Hello
2. BitConverter 클래스 사용 (16 진수)
System.BitConverter 클래스는 byte 배열을 16진수 문자열로 변환하는 방법을 제공합니다.
데이터 디버깅 및 로깅에서 자주 사용됩니다.
byte[] bytes = { 72, 101, 108, 108, 111 };
string str = BitConverter.ToString(bytes);
Console.WriteLine(str); // 출력: 48-65-6C-6C-6F
특징
- 16진수 이기 때문에 사람이 읽을 수 있다.
- 16진수 문자열로 표기 되기 때문에 기존 바이트 보다 문자열 크기 2배이상 커질 수 있다. (바이트당 2문자 -때문)
3. Convert 클래스 사용 (Base64)
System.Convert 클래스는 byte 배열을 Base64 문자열로 변환할 수 있습니다. 이 방법은 주로 데이터 전송이나 저장 시에 많이 사용됩니다.
네트워크 데이터 전송과 같은 상황에서 널리 사용됩니다.
byte[] bytes = { 72, 101, 108, 108, 111 };
string str = Convert.ToBase64String(bytes);
Console.WriteLine(str); // 출력: SGVsbG8=
특징
- 데이터 전송 및 저장에 효율적입니다. 기존 byte 배열보다 33%더 많은 메모리를 사용하지만 다른 변환 방법 보다 메모리적으로 효율 적임
4. StringBuilder 클래스 사용 (16 진수)
System.Text.StringBuilder 클래스를 사용하여 byte 배열을 반복문으로 문자열로 변환할 수도 있습니다. 이 방법은 특정 형식으로 변환할 때 유용합니다.
고성능 문자열 처리가 필요할 때 유용합니다.
byte[] bytes = { 72, 101, 108, 108, 111 };
StringBuilder sb = new StringBuilder();
foreach (byte b in bytes)
{
sb.Append(b.ToString("X2")); // 각 byte를 16진수로 변환
}
string str = sb.ToString();
Console.WriteLine(str); // 출력: 48656C6C6F
String to Byte
1. Encoding 클래스 사용
// 인코딩
string str = "Hello";
byte[] bytes = Encoding.UTF8.GetBytes(str);
// 디코딩
byte[] decodedBytes = Encoding.UTF8.GetBytes(str);
2. BitConverter 클래스 사용
BitConverter를 사용하여 byte 배열을 16진수 문자열로 인코딩한 경우, "-"의 문자열이 포함되기 때문에 이를 다시 byte 배열로 디코딩하는 과정은 좀 더 복잡합니다. 각 16진수 문자열을 byte로 변환해야 합니다.
1. Range 사용
사용하여 문자열의 인덱스를 생성하고, 각 짝수 인덱스에서 2문자씩 추출하여 바이트로 변환합니다.
- 추가적인 문자열 분할 작업이 필요 없습니다.
- 직접 인덱스를 사용하여 부분 문자열을 추출하므로, 메모리 할당과 처리 비용이 적습니다.
// 인코딩 (BitConverter)
byte[] bytes = { 72, 101, 108, 108, 111 };
string hexString = BitConverter.ToString(bytes).Replace("-", ""); // "48656C6C6F"
// 디코딩 (BitConverter)
byte[] decodedBytes = Enumerable.Range(0, hexString.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
.ToArray();
2. split를 사용한 방법
Convert.ToByte를 사용하여 바이트로 변환합니다.
- 문자열을 분할하는 작업은 추가 메모리 할당과 문자열 처리 비용이 발생합니다.
// 인코딩
byte[] bytes = { 72, 101, 108, 108, 111 };
string str = BitConverter.ToString(bytes);
// 디코딩
byte[] decodedBytes = str.Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();
3. Convert 클래스 사용
// 인코딩 (Base64)
byte[] bytes = { 72, 101, 108, 108, 111 };
string base64String = Convert.ToBase64String(bytes); // "SGVsbG8="
// 디코딩 (Base64)
byte[] decodedBytes = Convert.FromBase64String(base64String);
4. StringBuilder 클래스 사용
// 인코딩 (StringBuilder)
byte[] bytes = { 72, 101, 108, 108, 111 };
StringBuilder sb = new StringBuilder();
foreach (byte b in bytes)
{
sb.Append(b.ToString("X2")); // 각 byte를 16진수로 변환
}
string hexString = sb.ToString(); // "48656C6C6F"
// 디코딩 (StringBuilder)
byte[] decodedBytes = new byte[hexString.Length / 2];
for (int i = 0; i < hexString.Length; i += 2)
{
decodedBytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
인코딩 방식
1. UTF-8
설명
UTF-8은 가변 길이 문자 인코딩 방식으로, ASCII 문자들은 1바이트로, 나머지 문자들은 2~4바이트로 인코딩됩니다. 이는 유니코드의 모든 문자를 표현할 수 있습니다.
장점
- 국제화 지원: 전 세계의 모든 문자를 인코딩할 수 있습니다.
- 효율성: 영어와 같은 라틴 문자 기반 언어에서는 메모리 사용이 적습니다.
- 호환성: 대부분의 웹과 네트워크 프로토콜에서 기본 인코딩으로 사용됩니다.
단점
- 가변 길이: 모든 문자가 동일한 길이가 아니므로 일부 작업에서 처리 복잡성이 증가할 수 있습니다.
2. ASCII
설명
ASCII는 7비트 문자 인코딩 방식으로, 128개의 문자(영어 알파벳, 숫자, 특수 문자 및 제어 문자)를 표현할 수 있습니다.
장점
- 단순성: 인코딩과 디코딩이 매우 간단합니다.
- 효율성: 각 문자가 1바이트로 고정되어 있으므로 처리 속도가 빠릅니다.
단점
- 제한된 문자 집합: 영어 알파벳과 일부 특수 문자만 표현할 수 있습니다.
- 국제화 지원 부족: 다른 언어의 문자를 지원하지 않습니다.
3. Unicode (UTF-16)
설명
Unicode는 전 세계의 모든 문자를 표현할 수 있는 인코딩 표준입니다. UTF-16은 각 문자를 2바이트 또는 4바이트로 인코딩합니다.
장점
- 국제화 지원: 전 세계의 모든 문자를 인코딩할 수 있습니다.
- 일관된 문자 길이: 대부분의 문자가 2바이트로 고정되어 있습니다.
단점
- 메모리 사용량: 영어와 같은 문자에서는 UTF-8보다 더 많은 메모리를 사용할 수 있습니다.
- 호환성: UTF-8만큼 널리 사용되지 않으므로 일부 시스템에서는 지원되지 않을 수 있습니다.
4. 16진수 (Hexadecimal)
설명
16진수 인코딩은 각 바이트를 두 자리의 16진수로 표현하는 방식입니다. 예를 들어, 바이트 값 255는 "FF"로 표현됩니다.
장점
- 명확성: 바이너리 데이터를 쉽게 읽고 분석할 수 있습니다.
- 디버깅 유용성: 데이터의 각 바이트를 명확하게 볼 수 있습니다.
단점
- 메모리 사용량: 원래 데이터보다 2배의 크기를 차지합니다.
- 가독성 부족: 사람이 읽기에는 적합하지 않습니다.
5. Base64
설명
Base64는 바이너리 데이터를 텍스트 형식으로 변환하는 인코딩 방식입니다. 3바이트의 바이너리 데이터를 4바이트의 텍스트 데이터로 변환합니다.
장점
- 효율적 저장 및 전송: 바이너리 데이터를 텍스트 형식으로 변환하여 네트워크 전송과 저장에 적합합니다.
- 표준화: 다양한 시스템과 프로토콜에서 널리 사용됩니다.
단점
- 메모리 사용량: 원래 데이터보다 약 33% 더 많은 메모리를 사용합니다.
- 가독성 부족: 사람이 읽기에는 적합하지 않습니다.
요약
- UTF-8: 국제화 지원이 필요하고 메모리 효율성을 중시할 때 적합합니다.
- ASCII: 영어와 같은 단순한 문자 집합을 처리할 때 가장 효율적입니다.
- Unicode (UTF-16): 국제화 지원이 필요하고 일관된 문자 길이가 중요할 때 사용합니다.
- 16진수: 디버깅이나 데이터 분석에 유용하지만 메모리 효율성은 떨어집니다.
- Base64: 바이너리 데이터를 안전하게 텍스트로 변환하여 저장하거나 전송할 때 적합합니다.
'VisualStudio > C#' 카테고리의 다른 글
[C#] List<T> LINQ 모음 (0) | 2023.09.21 |
---|---|
[C#] Enum타입 리플렉션(Reflection)사용하여 값 받아오는 방법 (0) | 2023.02.16 |
[C#] Struct를 byte로 변환, byte를 Struct로 변환 (0) | 2023.02.02 |
[C#] Action.Invoke() vs Action() 차이 (0) | 2023.01.05 |
[C#] nameof()와 default(T) (0) | 2023.01.05 |