[C#] C #에서 문자열을 바이트 배열로 변환

VB에서 C #으로 무언가를 변환하고 있습니다. 이 문장의 구문에 문제가 있습니다 :

if ((searchResult.Properties["user"].Count > 0))
{
    profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}

그런 다음 다음 오류가 표시됩니다.

인수 1 : ‘object’에서 ‘byte []’로 변환 할 수 없습니다

‘System.Text.Encoding.GetString (byte [])’에 대해 가장 오버로드 된 메소드 일치에 올바르지 않은 인수가 있습니다.

게시물을 기반으로 코드를 수정하려고 했지만 여전히 성공하지 못했습니다.

string User = Encoding.UTF8.GetString("user", 0);

어떤 제안?



답변

바이트 배열이 이미 있으면 해당 바이트 배열로 인코딩하는 데 사용 된 인코딩 유형을 알아야합니다.

예를 들어, 바이트 배열이 다음과 같이 생성 된 경우 :

byte[] bytes = Encoding.ASCII.GetBytes(someString);

다음과 같이 문자열로 다시 설정해야합니다.

string someString = Encoding.ASCII.GetString(bytes);

상속 한 코드에서 바이트 배열을 만드는 데 사용 된 인코딩을 찾으면 설정해야합니다.


답변

먼저 System.Text네임 스페이스를 추가하십시오.

using System.Text;

그런 다음이 코드를 사용하십시오.

string input = "some text";
byte[] array = Encoding.ASCII.GetBytes(input);

그것을 고치기를 바랍니다!


답변

또한 확장 메소드 를 사용하여 string다음과 같이 유형에 메소드 를 추가 할 수 있습니다 .

static class Helper
{
   public static byte[] ToByteArray(this string str)
   {
      return System.Text.Encoding.ASCII.GetBytes(str);
   }
}

그리고 아래와 같이 사용하십시오 :

string foo = "bla bla";
byte[] result = foo.ToByteArray();


답변

var result = System.Text.Encoding.Unicode.GetBytes(text);


답변

static byte[] GetBytes(string str)
{
     byte[] bytes = new byte[str.Length * sizeof(char)];
     System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
     return bytes;
}

static string GetString(byte[] bytes)
{
     char[] chars = new char[bytes.Length / sizeof(char)];
     System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
     return new string(chars);
}


답변

Encoding.Default를 사용하지 않아야하는 이유 …

@Randall의 답변은을 사용 Encoding.Default하지만 Microsoft 는 이에 대한 경고를 표시합니다 .

컴퓨터마다 다른 인코딩을 기본값으로 사용할 수 있으며 기본 인코딩은 단일 컴퓨터에서 변경 될 수 있습니다. 기본 인코딩을 사용하여 컴퓨터간에 스트리밍되거나 동일한 컴퓨터에서 다른 시간에 검색된 데이터를 인코딩 및 디코딩하면 해당 데이터가 잘못 변환 될 수 있습니다. 또한 Default 속성에서 반환 된 인코딩은 가장 적합한 대체를 사용하여 지원되지 않는 문자를 코드 페이지에서 지원하는 문자로 매핑합니다. 이러한 이유로 기본 인코딩을 사용하지 않는 것이 좋습니다. 인코딩 된 바이트가 올바르게 디코딩되도록하려면 UTF8Encoding 또는 UnicodeEncoding과 같은 유니 코드 인코딩을 사용해야합니다. 또한 더 높은 수준의 프로토콜을 사용하여 인코딩 및 디코딩에 동일한 형식이 사용되도록 할 수 있습니다.

기본 인코딩이 무엇인지 확인하려면 Encoding.Default.WindowsCodePage(내 경우에는 1250을 사용하십시오. 슬프게도 사전 정의 된 CP1250 인코딩 클래스는 없지만 객체는로 검색 할 수 있습니다 Encoding.GetEncoding(1250))를 사용하십시오.

Encoding.ASCII 7bit이므로 내 경우에는 작동하지 않습니다.

byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e

… 그리고 UTF-8 인코딩을 대신 사용해야하는 이유 …

기본 인코딩은 오해의 소지가 있습니다. .NET은 모든 곳에서 UTF-8을 실제 기본값으로 사용합니다 (20 비트 말에 8 비트 인코딩은 더 이상 사용되지 않습니다. 세기를 확인하십시오 Console.OutputEncoding.EncodingName). 따라서 코드에서 정의한 모든 상수는 기본적으로 UTF-8로 인코딩됩니다. 이것은 데이터 소스가 다른 인코딩이 아닌 한 사용해야합니다.

* 이것은 직접 거짓말 인 내 경우에는 UTF-8입니다 chcp.Windows 콘솔 (cmd)에서 852가 반환되며 현지화 된 시스템 명령 (ping과 같은) 은이 코드 페이지에 하드 코드가 있으므로 변경해서는 안됩니다

Microsoft의 권장 사항에 따라 :

var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže

Encoding.UTF8 UTF-8 인코딩 인스턴스는 다른 사람이 권장하며 직접 또는 다음과 같이 사용할 수도 있습니다.

var utf8 = Encoding.UTF8 as UTF8Encoding;

… 항상 사용되는 것은 아닙니다

바이트 배열의 인코딩은 서방 국가에서는 유니 코드에서 “작동”해야하지만 동유럽에서와 같이 지원되지 않는 일부 지역으로 프로그램을 이동하자마자 정말 엉망입니다. 체코 어에서는 Windows 기본값을 사용합니다. (2020 년!) 콘솔 용 MS 비표준 852 (일명 Latin-2), Windows OEM으로서 1250, .NET (및 기타)으로서 UTF-8 (65001) 새로운 기본값이며 일부 서부 유럽 8 비트를 명심해야합니다. 데이터는 여전히 1252 년이지만 동유럽의 기존 8 비트 서부 표준은 ISO-8859-2 (일명 라틴 -2이지만 852와 같은 라틴 -2는 아님)입니다. ASCII를 사용한다는 것은 두부와 ‘?’로 가득 찬 텍스트를 의미합니다. 여기. 따라서 21 세기 반까지 UTF-8을 명시 적으로 설정하십시오 .


답변

오프 구축 알리의 대답은 , 당신이 선택적으로 사용할 인코딩을 전달 할 수있는 확장 방법을 추천 할 것입니다 :

using System.Text;
public static class StringExtensions
{
    /// <summary>
    /// Creates a byte array from the string, using the 
    /// System.Text.Encoding.Default encoding unless another is specified.
    /// </summary>
    public static byte[] ToByteArray(this string str, Encoding encoding = Encoding.Default)
    {
        return encoding.GetBytes(str);
    }
}

그리고 아래와 같이 사용하십시오 :

string foo = "bla bla";

// default encoding
byte[] default = foo.ToByteArray();

// custom encoding
byte[] unicode = foo.ToByteArray(Encoding.Unicode);