2012-05-01 5 views
0

텍스트 상자에있는 10 진수에서 16 진수로 변환 한 다음 바이트 배열로 변환하고이 배열을 BinaryWriter를 사용하여 원하는 오프셋으로 작성하는 방법을 알고 싶습니다.Decimal to ByteArray 및 오프셋에 쓰기

내 textBox11 십진수 값은 "101200001"이며 16 진수 값인 "06 08 30 81"을 특정 오프셋으로 파일에 써야합니다.

이것은 내가 가지고있는 것이지만, textBox11.Text에서 byteArray 로의 변환이 누락되었습니다.

int index = listBox1.SelectedIndex; 
    int startOffset = 0x00000008; 
    int itemIDDiff = 0x00000328; 

    BinaryWriter bw = new BinaryWriter(File.Open(_FileName, FileMode.Open)); 
    bw.BaseStream.Seek(startOffset + itemIDDiff * index, SeekOrigin.Begin); 
    bw.Write(/* textBox11.Text converted to HEX then to byte array? */); 
    bw.Close(); 

이 내가 쓸 필요가 파일의 일부입니다

00000330h: 02 00 00 00 00 00 00 00 4A 61 64 65 20 45 61 72 ; ........Jade Ear 
00000340h: 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00 00 ; ring............ 

의 난에 "06 08 30 81"를 "02 00 00 00"으로 변경하려면 가정 해 봅시다. BinaryWriter를 사용하면 어떻게 될까요?

답변

3

십진수를 16 진수로 변환 할 수 없습니다 (분수 부분은 어떻게 처리합니까?). 그러나 대신 Int64 (A long)를 사용할 수 있습니다 :

var text = "101200001"; 
var asLong = Convert.ToInt64(text); 
var asHex = asDecimal.ToString("X"); 

asHex 이제 이후에있는 16 진수 문자열이 있습니다.

그러나 당신이 가진 문제는 '16 진수'는 실제로 디스크의 원시 바이트 세트를 보는 것입니다. 숫자가 원시 바이트로 표시되는 방식은 프로그램 자체에 따라 다릅니다. 바이너리 라이터를 가지고 있다면, 쓰려고하는 숫자의 바이트 표현을 알아야합니다. 이것은 (문자열로 변환하지 않고) 그 자체로 충분히있을 수 있습니다 :

bw.Write(asLong); 

이 더 바라보며, 그것은 보인다는 4 바이트의 숫자 후있어 것처럼, int 치의 그렇게하지 갈망. BitConverter은 좋지만, 모든 것을 역순으로 작성합니다. 일 수 있습니다.. 그래서 마음에 이러한를 유지하고 아래 검토 :

var text = "101200001"; 
var asInt = Convert.ToInt32(text);     // 4 byte number 
var asBytes = BitConverter.GetBytes(asInt).Reverse(); // same hex representation as a byte array (same order) 

을 그래서 당신의 예제이 추가 :

bw.Write(asBytes); 
+0

이 내가 쓸 필요가 파일의 일부입니다 질문에 제안하지만, 예외적으로

bw.Write(int.Parse(textBox11.Text)); 

큰 엔디안를 들어, 바이트 순서를 반대로해야합니다 : 00000330h : 02 00 00 00 00 00 00 4A 61 64 65 20 45 61 72; ........ 옥이 귀 00000340h : 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00; ring ............ "02 00 00 00"을 "06 08 30 81"으로 변경하고 싶습니다. 어떻게 처리합니까? –

2

당신은 16 진수 표현으로 숫자를 변환 할 수 있습니다, 그 구문 분석,하지만 것 완전히 무의미하다.

bw.Write(data, 0, data.Length); 
:

byte[] data = BitConverter.GetBytes(Int32.Parse(textBox11.Text)); 

이 그럼 당신은 스트림에 바이트 쓰기 :

당신은 바이트 배열로 숫자를 얻기 위해 다음 번호, BitConverter.GetBytes 방법으로 문자열을 구문 분석 Int32.Parse 방법을 사용

리틀 엔디안 번호 표현이있는 시스템의 바이트에 81, 30, 08 06 바이트를 쓰는 것에주의하십시오. Intel (또는 호환) CPU 기반 컴퓨터.이 파일에서 큰 엔디안 표현을 원한다면, 당신은 그것을 쓰기 전에 배열을 반대 할 것이다 : 거의 큰 엔디안이 필요한 경우 그것은 분명하지 않다

Array.Reverse(data); 
3

. 리틀 엔디안은 간단하다 :

var bytes = BitConverter.GetBytes(int.Parse(textBox11.Text)); 
Array.Reverse(bytes); 
bw.Write(bytes); 
+0

고마워요! 그것을 가지고있어 :) –