2012-09-11 3 views
1

예, 솔루션을 읽은 지 약 5 시간이며 아무 것도 작동하지 않습니다. BitConverter는 빈 문자열을 만듭니다.ByteArray를 TextBox에서 사용하기 위해 String으로 변환하십시오. C#

기본적으로 내가하고있는 일은 16 진수를 통해 레벨 내용을 읽고 결국 트리 뷰에 표시하는 수준 판독기를 만드는 것입니다. 그래서 내가해야 할 일은 데이터를 편집 할 수있는 바이트 배열을 만드는 것입니다. 그러나 이제는 화면에 데이터를 표시하려고합니다. 내 지식을 화면에 바이트 배열을 표시 할 수 없습니다, 먼저 문자열로 변환해야합니다.

그래서 그게 내가 할 노력하고있어 무엇 :

 using (OpenFileDialog fileDialog = new OpenFileDialog()) 
     { 
      if (fileDialog.ShowDialog() != DialogResult.Cancel) 
      { 
       textBox1.Text = fileDialog.FileName; 
       using (BinaryReader fileBytes = new BinaryReader(new MemoryStream(File.ReadAllBytes(textBox1.Text)))) 
       { 
        string s = null; 
        int length = (int)fileBytes.BaseStream.Length; 
        byte[] hex = fileBytes.ReadBytes(length); 
        File.WriteAllBytes(@"c:\temp_file.txt", hex); 
       } 
      } 
     } 
    } 

참고 : 난 아무것도 나의 변환 시도를 제거한 내가 일을 시도했다. 누구든지이 데이터를 사용하여 문자열로 변환하고 텍스트 상자에 추가하는 방법을 알고 있습니까? (나는 후자를하는 법을 알고 있습니다. 나는 이전에 어려움을 겪고 있습니다.) 그렇다면 예제를 제공해주십시오.

편집 :

아마 자신이 더 명확 했어야; 바이트를 해당 문자로 변환하고 싶지 않습니다 (예 : 0x43이면 'C'를 인쇄하고 싶지 않습니다. '43'을 인쇄하고 싶습니다.)

PS 답변 및 대부분의 작품에 대답하지만, 너무 느리게 사용할 수 있습니다. 다른 답변은 멋진 일이 될거야 :)

+0

을 데이터 매트릭스와 같은 뷰를 생성합니다 이진 파일 형식을 사용합니까? – tomfanning

+0

문제는 시도한 솔루션을 알 수 없다는 것입니다. 나는. 보셨습니까 [이 답변] (http://stackoverflow.com/a/311179/15498)? 또한 바이너리 리더의 메모리 스트림에 바이트 배열을 래핑하는 것으로, 바이트 배열로 다시 변환 할 수 있습니까? –

+0

@Damien_The_Unbeliever - 허용 된 답변의 두 가지 방법이 실제로 작동합니다. 하지만 약 10kb 파일에서만 작동합니다. 다른 것은 가능하며 실행하기에는 너무 오래 걸립니다. (1 분 이상 읽음). 아이디어가 있으십니까? – Anteara

답변

2

이 있습니까 당신이하는 당신의 바이트 배열을 인코딩 알고는 저장됩니까?

당신은 여기 MSDN 예를

using System; 
using System.IO; 
using System.Text; 

public class Example 
{ 
    const int MAX_BUFFER_SIZE = 2048; 
    static Encoding enc8 = Encoding.UTF8; 

    public static void Main() 
    { 
     FileStream fStream = new FileStream(@".\Utf8Example.txt", FileMode.Open); 
     string contents = null; 

     // If file size is small, read in a single operation. 
     if (fStream.Length <= MAX_BUFFER_SIZE) { 
     Byte[] bytes = new Byte[fStream.Length]; 
     fStream.Read(bytes, 0, bytes.Length); 
     contents = enc8.GetString(bytes); 
     } 
     // If file size exceeds buffer size, perform multiple reads. 
     else { 
     contents = ReadFromBuffer(fStream); 
     } 
     fStream.Close(); 
     Console.WriteLine(contents); 
    } 

    private static string ReadFromBuffer(FileStream fStream) 
    { 
     Byte[] bytes = new Byte[MAX_BUFFER_SIZE]; 
     string output = String.Empty; 
     Decoder decoder8 = enc8.GetDecoder(); 

     while (fStream.Position < fStream.Length) { 
      int nBytes = fStream.Read(bytes, 0, bytes.Length); 
      int nChars = decoder8.GetCharCount(bytes, 0, nBytes); 
      char[] chars = new char[nChars]; 
      nChars = decoder8.GetChars(bytes, 0, nBytes, chars, 0); 
      output += new String(chars, 0, nChars);              
     } 
     return output; 
    } 
} 
// The example displays the following output: 
//  This is a UTF-8-encoded file that contains primarily Latin text, although it 
//  does list the first twelve letters of the Russian (Cyrillic) alphabet: 
//  
//  А б в г д е ё ж з и й к 
//  
//  The goal is to save this file, then open and decode it as a binary stream. 

편집

하면 16 진수 형식으로 바이트 배열을 인쇄하려면, BitConverter 당신이 양식을 찾고있는 것이다 Encoding.GetString 방법

필요 여기에 MSDN

// Example of the BitConverter.ToString(byte[ ]) method. 
using System; 

class BytesToStringDemo 
{ 
    // Display a byte array with a name. 
    public static void WriteByteArray(byte[ ] bytes, string name) 
    { 
     const string underLine = "--------------------------------"; 

     Console.WriteLine(name); 
     Console.WriteLine(underLine.Substring(0, 
      Math.Min(name.Length, underLine.Length))); 
     Console.WriteLine(BitConverter.ToString(bytes)); 
     Console.WriteLine(); 
    } 

    public static void Main() 
    { 
     byte[ ] arrayOne = { 
      0, 1, 2, 4, 8, 16, 32, 64, 128, 255 }; 

     byte[ ] arrayTwo = { 
      32, 0, 0, 42, 0, 65, 0, 125, 0, 197, 
      0, 168, 3, 41, 4, 172, 32 }; 

     byte[ ] arrayThree = { 
      15, 0, 0, 128, 16, 39, 240, 216, 241, 255, 
      127 }; 

     byte[ ] arrayFour = { 
      15, 0, 0, 0, 0, 16, 0, 255, 3, 0, 
      0, 202, 154, 59, 255, 255, 255, 255, 127 }; 

     Console.WriteLine("This example of the " + 
      "BitConverter.ToString(byte[ ]) \n" + 
      "method generates the following output.\n"); 

     WriteByteArray(arrayOne, "arrayOne"); 
     WriteByteArray(arrayTwo, "arrayTwo"); 
     WriteByteArray(arrayThree, "arrayThree"); 
     WriteByteArray(arrayFour, "arrayFour"); 
    } 
} 

/* 
This example of the BitConverter.ToString(byte[ ]) 
method generates the following output. 

arrayOne 
-------- 
00-01-02-04-08-10-20-40-80-FF 

arrayTwo 
-------- 
20-00-00-2A-00-41-00-7D-00-C5-00-A8-03-29-04-AC-20 

arrayThree 
---------- 
0F-00-00-80-10-27-F0-D8-F1-FF-7F 

arrayFour 
--------- 
0F-00-00-00-00-10-00-FF-03-00-00-CA-9A-3B-FF-FF-FF-FF-7F 
*/ 
+0

+1. 소스가 텍스트 인 경우 유용합니다 (또한 질문 에서처럼 보이지 않습니다). –

+0

@AlexeiLevenkov, 바이트 배열을 텍스트로 변환하려면 모든 인코딩에서 텍스트 바이트가 들어 있어야합니다. 틀렸습니까? –

+0

OP가 "텍스트로 바이트 배열 변환"으로 무엇을 원하는지 잘 모릅니다.하지만 OP는 적어도 인쇄 가능한 출력 (아마도 0-31 범위 밖에있는 문자)을 갖고 싶어합니다. 소스가 텍스트이고 잘못된 인코딩을 선택하면 소스가 무작위 인 경우 사용할 수없는 출력 (또는 잘못된 UTF8 시퀀스에 대한 예외)이 표시됩니다. 대부분의 경우 인쇄물에 인쇄 가능한 출력이 없지만 "인코딩"이 무엇인지 확실하지 않습니다. 바이트의 순서는 어떤 일반 인코딩으로 변환 할 수 없다 ... –

1

먼저 UTF8과 같은 유용한 정보로 바이트를 변환해야합니다. 그것에서 문자열을 얻을 수 있습니다. (: ISO-8859-1 내 경우) : 같은 뭔가

buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buf); 
tempString = Encoding.UTF8.GetString(buf, 0, count); 
+0

음, 뒤얽힌 것 같습니다! – tomfanning

+0

소스 데이터가 문자열이 아니면 다음과 같이 훨씬 나아지지 않습니다. 또한 모든 바이트 시퀀스가 ​​유효한 UTF8 시퀀스가 ​​아닌 것처럼 단순히 throw 할 수 있습니다. –

2

당신은 진수로 데이터를 변환 할 수 있습니다

StringBuilder hex = new StringBuilder(theArray.Length * 2); 
    foreach (byte b in theArray) 
    hex.AppendFormat("{0:x2}", b); 
    return hex.ToString(); 
+0

+1 이것은 당신에게 16 진수를 가져다 줄 것입니다. 보통 보통 LINQ 싱글 문을 더 좋아합니다. :)하지만 전문가가 아닌 사람들은이 문장을 더 읽을 수 있습니다. –

+0

이 작업을 시도하고 인쇄 할 때 인쇄되는 것은 모두'System.Byte []'입니다. 이것은 내가 한 일입니다. http://pastebin.com/XTJW2iAS 읽기 : '길이'는 원래 게시물에 정의되어 있습니다. 아마도 내가 잘못된 것을했을 것입니다 ... – Anteara

+0

매우 간단합니다 ... textBox2.Text = hex.ToString(); 은 이어야합니다. textBox2.Text = hex1.ToString(); 16 진수 대신 16 진수 ... – Eden

1

정말 랜덤 바이트 시퀀스를 표시 할 기본 방법은 없습니다. 옵션 :

  • base64로 인코딩 (Convert.ToBase64String) - 읽을 수 있지만, 적어도 안전하게 인쇄 문자열
  • HEX 인코딩 각 바이트 및 각 바이트의 표현 사이의 공간을 연결하여, 잠재적으로 여러 그룹으로 분할하지를 생성합니다 (즉, 16 바이트). - 더 많은 해커와 같은 견해를 낳을 것입니다.
  • 지도를 인쇄 할 수없는 문자 (잠재적 색깔의) 가능성이 여러 줄에 나누어 모든 바이트를 -하지만 텍스트 인코딩이 당신을한다 - 나는 당신이 모르는 의심 ...
관련 문제