C#读取一个exe文件并转换为16进制存储。

Out_Put_Stream 2016-08-26 09:51:14

我是菜鸟。。。

FileStream fs = new FileStream("C:\\testdds.exe", FileMode.Open, FileAccess.Read);
int fileLength = Convert.ToInt32(fs.Length);
//得到对像大小
byte[] fileByteArray = new byte[fileLength];
//声明一个byte数组
BinaryReader br = new BinaryReader(fs);
//声明一个读取二进流的BinaryReader对像
for (int i = 0; i < fileLength; i++)
{//循环数组
br.Read(fileByteArray, 0, fileLength);
//将数据读取出来放在数组中
}
string linshi="";
for (int i = 0; i < fileByteArray.Length; i++)
{
int b = fileByteArray[i];
string bb = Convert.ToString(b, 16);
linshi = linshi + bb;
}




linshi的确被转换成正确的16进制






但我发现当中的00没有被加载到linshi变量中,然后我将linshi变量遍历变成byte[]数组写出的文件也跟原来的文件大小差了一点,并且无法打开。

那个00是不是跟什么对齐有关系?

请问这个问题怎么解决...






...全文
540 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
飒风 2020-03-08
  • 打赏
  • 举报
回复
string str = null;
for (int i = 0; i < fileByteArray.Length; i++)
{
int b = fileByteArray[i];
str = string.Format("{0} {1:X02}", str, b);
}
结果:4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
有点久远了 看见的晚 希望对后来人有帮助
qq_29348443 2017-09-09
  • 打赏
  • 举报
回复
我晕,原来这个问题已经有人解决了,我从百度链接直接过来,没显示采纳的答案……
qq_29348443 2017-09-07
  • 打赏
  • 举报
回复
我来告诉你,那是为有的字节只有一位,比如0,或者3,你加一下判断,if(bb.Length == 1){bb = "0" + bb;}这样就可以了,如果你试过还不成功,可以联系我 QQ570999242,但应该不会不行的,因为我都实验通过了,加好友注明 "C# csdn"
Out_Put_Stream 2016-08-27
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
还在认为是00没了 你就没自己去测试过 Convert.ToString(77, 16); --> "4d" Convert.ToString(90, 16); --> "5a" Convert.ToString(144, 16); --> "90" Convert.ToString(0, 16); --> "0" Convert.ToString(3, 16); --> "3" 合起来就是4d5a9003 明白了么
4d5a9003....................这些占的字节与原来少四分之一 我感觉就是00没有进去的原因。。
Out_Put_Stream 2016-08-27
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
还在认为是00没了 你就没自己去测试过 Convert.ToString(77, 16); --> "4d" Convert.ToString(90, 16); --> "5a" Convert.ToString(144, 16); --> "90" Convert.ToString(0, 16); --> "0" Convert.ToString(3, 16); --> "3" 合起来就是4d5a9003 明白了么
大哥,那我想用读出来的4d5a9003................................重新写出文件,怎么写?
xuzuning 2016-08-27
  • 打赏
  • 举报
回复
C# 为了满足不同场合的需求,提供了很多方法供你选用
        static void Main(string[] args)
        {
            byte[] b = { 77, 90, 144, 0, 3 };
            Console.WriteLine(Convert.ToString(b[3], 16)); //0
            Console.WriteLine(b[3].ToString("x2")); //00
            Console.WriteLine(BitConverter.ToString(b)) //4D-5A-90-00-03;
        }
Out_Put_Stream 2016-08-27
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
还在认为是00没了 你就没自己去测试过 Convert.ToString(77, 16); --> "4d" Convert.ToString(90, 16); --> "5a" Convert.ToString(144, 16); --> "90" Convert.ToString(0, 16); --> "0" Convert.ToString(3, 16); --> "3" 合起来就是4d5a9003 明白了么
Convert.ToString(0, 16); --> "0" Convert.ToString(3, 16); --> "3" 这两个怎么处理啊?
Poopaye 2016-08-26
  • 打赏
  • 举报
回复
还在认为是00没了 你就没自己去测试过 Convert.ToString(77, 16); --> "4d" Convert.ToString(90, 16); --> "5a" Convert.ToString(144, 16); --> "90" Convert.ToString(0, 16); --> "0" Convert.ToString(3, 16); --> "3" 合起来就是4d5a9003 明白了么
Out_Put_Stream 2016-08-26
  • 打赏
  • 举报
回复
Convert.ToString 打印出来是十六禁止的数据,截图当中在c32 asm当中也对照了,确实正确。 但是我发现00的就不对照了,想知道是什么原因。。 记得以前书里哪里瞄到过cpu填充对其什么东西的。 我是自学的,不容易啊。
Out_Put_Stream 2016-08-26
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
上一贴就和你说了,单独把Convert.ToString的结果打出来看
那个linshi里面不确实对照了么?就是那个00没有。
Poopaye 2016-08-26
  • 打赏
  • 举报
回复
上一贴就和你说了,单独把Convert.ToString的结果打出来看

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧