UTF-8 byte []를 문자열로 변환하는 방법은 무엇입니까?
나는이 byte[]
내가 알고 일이있는 파일에서로드되는 배열은 포함 UTF-8 . 일부 디버깅 코드에서 문자열로 변환해야합니다. 이것을 할 하나의 라이너가 있습니까?
내부적으로 는 할당과 memcopy 일 뿐이 므로 구현되지 않더라도 가능해야합니다.
string result = System.Text.Encoding.UTF8.GetString(byteArray);
이 변환을 수행하는 방법에는 적어도 네 가지가 있습니다.
Encoding의 GetString
이지만 해당 바이트에 ASCII가 아닌 문자가있는 경우 원래 바이트를 다시 가져올 수 없습니다.BitConverter.ToString
출력은 "-"로 구분 된 문자열이지만 문자열을 다시 바이트 배열로 변환하는 .NET 기본 제공 메서드는 없습니다.Convert.ToBase64String
을 사용하여 출력 문자열을 다시 바이트 배열로 쉽게 변환 할 수 있습니다Convert.FromBase64String
.
참고 : 출력 문자열에는 '+', '/'및 '='가 포함될 수 있습니다. URL에서 문자열을 사용하려면 명시 적으로 인코딩해야합니다.HttpServerUtility.UrlTokenEncode
를 사용하여 출력 문자열을 다시 바이트 배열로 쉽게 변환 할 수 있습니다HttpServerUtility.UrlTokenDecode
. 출력 문자열은 이미 URL 친화적입니다! 단점은System.Web
프로젝트가 웹 프로젝트가 아닌 경우 어셈블리 가 필요하다는 것 입니다.
전체 예 :
byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters
string s1 = Encoding.UTF8.GetString(bytes); // ���
byte[] decBytes1 = Encoding.UTF8.GetBytes(s1); // decBytes1.Length == 10 !!
// decBytes1 not same as bytes
// Using UTF-8 or other Encoding object will get similar results
string s2 = BitConverter.ToString(bytes); // 82-C8-EA-17
String[] tempAry = s2.Split('-');
byte[] decBytes2 = new byte[tempAry.Length];
for (int i = 0; i < tempAry.Length; i++)
decBytes2[i] = Convert.ToByte(tempAry[i], 16);
// decBytes2 same as bytes
string s3 = Convert.ToBase64String(bytes); // gsjqFw==
byte[] decByte3 = Convert.FromBase64String(s3);
// decByte3 same as bytes
string s4 = HttpServerUtility.UrlTokenEncode(bytes); // gsjqFw2
byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
// decBytes4 same as bytes
인코딩을 모르는 경우 바이트 배열에서 문자열로 변환하는 일반적인 솔루션 :
static string BytesToStringConverted(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
using (var streamReader = new StreamReader(stream))
{
return streamReader.ReadToEnd();
}
}
}
정의:
public static string ConvertByteToString(this byte[] source)
{
return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}
사용 :
string result = input.ConvertByteToString();
Converting a byte[]
to a string
seems simple but any kind of encoding is likely to mess up the output string. This little function just works without any unexpected results:
private string ToString(byte[] bytes)
{
string response = string.Empty;
foreach (byte b in bytes)
response += (Char)b;
return response;
}
Using (byte)b.ToString("x2")
, Outputs b4b5dfe475e58b67
public static class Ext {
public static string ToHexString(this byte[] hex)
{
if (hex == null) return null;
if (hex.Length == 0) return string.Empty;
var s = new StringBuilder();
foreach (byte b in hex) {
s.Append(b.ToString("x2"));
}
return s.ToString();
}
public static byte[] ToHexBytes(this string hex)
{
if (hex == null) return null;
if (hex.Length == 0) return new byte[0];
int l = hex.Length / 2;
var b = new byte[l];
for (int i = 0; i < l; ++i) {
b[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return b;
}
public static bool EqualsTo(this byte[] bytes, byte[] bytesToCompare)
{
if (bytes == null && bytesToCompare == null) return true; // ?
if (bytes == null || bytesToCompare == null) return false;
if (object.ReferenceEquals(bytes, bytesToCompare)) return true;
if (bytes.Length != bytesToCompare.Length) return false;
for (int i = 0; i < bytes.Length; ++i) {
if (bytes[i] != bytesToCompare[i]) return false;
}
return true;
}
}
There is also class UnicodeEncoding, quite simple in usage:
ByteConverter = new UnicodeEncoding();
string stringDataForEncoding = "My Secret Data!";
byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);
Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));
Alternatively:
var byteStr = Convert.ToBase64String(bytes);
A Linq one-liner for converting a byte array byteArrFilename
read from a file to a pure ascii C-style zero-terminated string would be this: Handy for reading things like file index tables in old archive formats.
String filename = new String(byteArrFilename.TakeWhile(x => x != 0)
.Select(x => x < 128 ? (Char)x : '?').ToArray());
I use '?'
as default char for anything not pure ascii here, but that can be changed, of course. If you want to be sure you can detect it, just use '\0'
instead, since the TakeWhile
at the start ensures that a string built this way cannot possibly contain '\0'
values from the input source.
BitConverter
class can be used to convert a byte[]
to string
.
var convertedString = BitConverter.ToString(byteAttay);
Documentation of BitConverter
class can be fount on MSDN
To my knowledge none of the given answers guarantee correct behavior with null termination. Until someone shows me differently I wrote my own static class for handling this with the following methods:
// Mimics the functionality of strlen() in c/c++
// Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well
static int StringLength(byte[] buffer, int startIndex = 0)
{
int strlen = 0;
while
(
(startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds
&& buffer[startIndex + strlen] != 0 // The typical null terimation check
)
{
++strlen;
}
return strlen;
}
// This is messy, but I haven't found a built-in way in c# that guarentees null termination
public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0)
{
strlen = StringLength(buffer, startIndex);
byte[] c_str = new byte[strlen];
Array.Copy(buffer, startIndex, c_str, 0, strlen);
return Encoding.UTF8.GetString(c_str);
}
The reason for the startIndex
was in the example I was working on specifically I needed to parse a byte[]
as an array of null terminated strings. It can be safely ignored in the simple case
hier is a result where you didnt have to bother with encoding. I used it in my network class and send binary objects as string with it.
public static byte[] String2ByteArray(string str)
{
char[] chars = str.ToArray();
byte[] bytes = new byte[chars.Length * 2];
for (int i = 0; i < chars.Length; i++)
Array.Copy(BitConverter.GetBytes(chars[i]), 0, bytes, i * 2, 2);
return bytes;
}
public static string ByteArray2String(byte[] bytes)
{
char[] chars = new char[bytes.Length / 2];
for (int i = 0; i < chars.Length; i++)
chars[i] = BitConverter.ToChar(bytes, i * 2);
return new string(chars);
}
In adition to the selected answer, if you're using .NET35 or .NET35 CE, you have to specify the index of the first byte to decode, and the number of bytes to decode:
string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length);
Try this console app:
static void Main(string[] args)
{
//Encoding _UTF8 = Encoding.UTF8;
string[] _mainString = { "Héllo World" };
Console.WriteLine("Main String: " + _mainString);
//Convert a string to utf-8 bytes.
byte[] _utf8Bytes = Encoding.UTF8.GetBytes(_mainString[0]);
//Convert utf-8 bytes to a string.
string _stringuUnicode = Encoding.UTF8.GetString(_utf8Bytes);
Console.WriteLine("String Unicode: " + _stringuUnicode);
}
참고URL : https://stackoverflow.com/questions/1003275/how-to-convert-utf-8-byte-to-string
'development' 카테고리의 다른 글
HTML5 / Canvas / JavaScript를 사용하여 브라우저 내 스크린 샷 찍기 (0) | 2020.09.28 |
---|---|
단일 파일의 하드 리셋 (0) | 2020.09.28 |
API 버전 관리에 대한 모범 사례? (0) | 2020.09.28 |
통화를 나타 내기 위해 Double 또는 Float를 사용하지 않는 이유는 무엇입니까? (0) | 2020.09.28 |
Pandas DataFrame 열 헤더에서 목록 가져 오기 (0) | 2020.09.28 |