2009-05-06 2 views
2

좋아요, 그래서 이미지 파일의 경로를 가져 와서 이진 데이터를 문자열로 반환하는 함수가 있습니다. 그런 다음 호출자는 리턴 된 문자열을 XML 요소의 내부 텍스트에 삽입합니다.이진 데이터와 문자 데이터의 혼동

이 올바른?

string dataAsString = ""; 
using (StreamReader sr = new StreamReader(new FileStream(mergedFile, FileMode.Open, FileAccess.Read, FileShare.Read, 2048, FileOptions.DeleteOnClose)))   
dataAsString = sr.ReadToEnd(); 
return dataAsString; 

이 그것을 합법적으로 바이너리 데이터 수 있습니다처럼 보이는 뭔가를 반환하지만 대상 파일에서 내용을 잘라 붙여 넣을 경우, 새로운 테스트 TIF 파일에 붙여 넣인가 그런 다음 tif 이미지를 열려고하면 나에게 불만 스럽습니다 ... 그래서 나는 데이터를 읽거나 쓰는 방식에 문제가 있다고 의심합니다.

정말 이런 식으로해야합니까?

using (BinaryReader br = new BinaryReader(new FileStream(mergedFile, FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.None)))  
{ 
    int blockReadSz = 2048; 
    int bytesToRead = (int)br.BaseStream.Length; 
    int bytesRead = 0; 
    byte[] data = new byte[bytesToRead]; 
    while (bytesRead < bytesToRead)   
    bytesRead += br.Read(data, bytesRead, blockReadSz);  
} 

그렇다면 파일을 읽은 후 바이트 []에서 문자열을 가져 오는 방법은 무엇입니까?

도움 주셔서 감사합니다. : D

답변

3

당신이 정말 이해가되지 않습니다 요구하고있다. 이진 데이터를 문자열로 읽을 수는 없습니다.

쉽게 사용하지 않고 바이트 배열에 데이터를 읽을 수있는 BinaryReader :

byte[] data = File.ReadAllBytes(mergedFile); 

XML 문서에 데이터를 입력 할 경우, 사용 예를 들어, 어떻게 든 텍스트로 표현해야 base64 인코딩 :

처음에는 인코딩 된 문자열이 아니므로 데이터를 문자열로 디코딩 할 수 없습니다. 어떤 인코딩을 사용하든 바이너리 데이터에는 항상 인코딩 텍스트로 생성되는 것이 아닌 바이트 시퀀스가 ​​포함될 수 있습니다.

+0

File.ReadAllBytes가 더 좋습니다. 그거 잊어 버렸어! +1 – Keltex

+0

아 깔끔한. ReadAllBytes는 편리합니다. +1. :디 – cakeforcerberus

1

두 번째 방법이 더 좋습니다. 첫 번째 접근 방식은 효과가 있지만 인코딩 문제가 발생할 가능성이 높습니다.

데이터를 XML 문서에 삽입해야하는 경우 Convert.ToBase64String(yourByteArray);을 사용하십시오. 문자열에서 byte[]을 되 찾으려면 Convert.FromBase64String(yourStringFromXML);

2

은 텍스트 인 것처럼 파일을 읽습니다. 예, 데이터를 읽으려면 BinaryReader 또는 FileStream을 사용해야합니다. 사실 여기서 BinaryReader은 중복됩니다. FileStream은 자체적으로 작동합니다. FileStream.Read을 사용하십시오. 파일이 문자열에 넣을 수있을만큼 짧기 때문에 다음 코드가 유용 할 것입니다.

using (FileStream fs = new new FileStream(mergedFile, FileAccess.Read))   
{ 
    int length = (int) fs.Length; 
    byte[] data = new byte[length]; 
    fs.Read(data, 0, length); 
    // convert to string here... TBD 
} 

다음으로 이진 데이터를 문자열로 변환하려고합니다. 이것은이 문자열을 나타내는 방법에 달려 있습니다. 이 ASCII (그리고 각 바이트는 문자로 변환 할) 경우에, 당신은 같은 것을 할 것입니다 :

string myString = System.Text.Encoding.UTF8.GetString(data); 
+0

대단히 감사합니다! :) – cakeforcerberus

+0

죄송합니다. Read 메서드의 반환 값을 확인하는 것을 잊었습니다. 요청한 모든 데이터를 읽을 수있는 것은 아니므로 전체 파일을 가져 오기 위해 실제로 읽은 데이터의 양을 확인해야합니다. – Guffa

관련 문제