寻找高手用C# 重写这段C++代码

C/C++ code

unsigned int r,i,n,e;

 char *fn=new char[30];
 unsigned char *buf=new unsigned char[4000];
 union ulc{uc c[4];unsigned long ul;}mlen;
 AnsiString s,s1;
 FILE *fp;

 ListBox1->Clear();
 r=getlist(ck);
 Edit3->Text=r;
 e=r*24;
 Sleep(500);

 fp=fopen("filetmp.tmp","rb");
  if(fp==NULL){ShowMessage("打不开文件");return;}
 fseek(fp,0,SEEK_SET);
 fread(buf,1,e,fp);
 fclose(fp);


 for(i=0;i<r;i++)
  {
    for(n=0;n<20;n++)fn[n]=buf[i*24+4+n];
    fn[20]=0;
    for(n=0;n<4;n++)mlen.c[3-n]=buf[i*24+n];
    s1=AnsiString(fn);
    s=s1+",长度:"+IntToStr(mlen.ul);
    ListBox1->Items->Insert(i,s);
  }

 remove("filetmp.tmp");
 delete buf;
 delete fn;




我自己用C# 写了一个 但是打开之后都是乱码 而且 格式也不对 

下边是我用C#写的

C# code

StreamReader sr = new StreamReader("filetmp.tmp", System.Text.Encoding.GetEncoding("GB2312"));
//StreamReader sr = new StreamReader("filetmp.tmp", System.Text.Encoding.UTF8);
string sss = sr.ReadToEnd();
Console.WriteLine(sss);

作者: pridescc   发布时间: 2011-06-16

自己写的效果是这样的
\0\0>chaobiaogudong.dbf\0\0\0\0孤东抄表程序.bin\0\0\0\0\0\09萳ogo.bin\0\0\0\0\0\0\0\0\0\0\0\0\0脏chaobiao.dbf\0\0\0\0\0\0\0\0\02`测试程序.bin\0\0\0\0\0\0\0\0\0\0Ifoxuser.dbf\0\0\0\0\0\0\0\0\0\0\0;a34.dbf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\05.dbf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0檃2.dbf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\f乤1.dbf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0纗抄表样板程序.bin\0\0\0\0\0\0`耡188.bin\0\0\0\0\0\0\0\0\0\0\0\0"

我已经选了GB了呀 为什么还是这样呢

作者: pridescc   发布时间: 2011-06-16


试试System.Text.ASCIIEncoding

作者: ghost5216   发布时间: 2011-06-16


试试System.Text.UnicodeEncoding 

作者: ghost5216   发布时间: 2011-06-16

首先要知道你文件的编码,读取时是按文本读还是按二进制读,c代码是按二进制读取,你可以试着用BinaryReader

作者: bdmh   发布时间: 2011-06-16

引用 4 楼 bdmh 的回复:

首先要知道你文件的编码,读取时是按文本读还是按二进制读,c代码是按二进制读取,你可以试着用BinaryReader


我若是用二进制读取

作者: pridescc   发布时间: 2011-06-16

for(i=0;i<r;i++)
  {
  for(n=0;n<20;n++)fn[n]=buf[i*24+4+n];
  fn[20]=0;
  for(n=0;n<4;n++)mlen.c[3-n]=buf[i*24+n];
  s1=AnsiString(fn);
  s=s1+",长度:"+IntToStr(mlen.ul);
  ListBox1->Items->Insert(i,s);
  }

主要是这。代码不算难。楼主是可以搞定的。有一点楼主弄明白就好了。
这个里面的数据。并不是桉着顺序放的。只需要相应的转换就可以了。

作者: zanfeng   发布时间: 2011-06-16

System.Text.Encoding.Default

作者: Icedmilk   发布时间: 2011-06-16

C# code
fn[20]=0;

fn[20]已经为0。要知道c#转换为字符。0是结束符。在这个字符之前才会转为文字。


  byte[] fn = new byte[20];
  byte[] buf = new byte[4000];
  string s, s1;
  FileStream fp = System.IO.File.Open("filetmp.tmp", FileMode.Open);
  fp.Seek(0, SeekOrigin.Begin);
  fp.Read(buf, 0, buf.Length);
  int r = Console.Read();
  for (int i = 0; i < r; i++)
  {
  for (int n = 0; n < 20; n++)
  {
  fn[n] = buf[i * 24 + 4 + n];
  }
  fn [20]=0;
  string str = System.Text.Encoding.ASCII.GetString(fn);
  //str好象就是你要的结果了。
  for (int n = 0; n < 4; n++)
  {

  }
  }

作者: zanfeng   发布时间: 2011-06-16

自己顶一下 。。。。。 这个问题是个好问题

作者: pridescc   发布时间: 2011-06-16

引用 8 楼 zanfeng 的回复:

C# code
fn[20]=0;

fn[20]已经为0。要知道c#转换为字符。0是结束符。在这个字符之前才会转为文字。


byte[] fn = new byte[20];
byte[] buf = new byte[4000];
string s, s1;
FileStream ……


中文全是问号。。。。。。。。。。

作者: pridescc   发布时间: 2011-06-16

u p

作者: yzm888   发布时间: 2011-06-16

C# code


byte[] fn = new byte[20];
  byte[] buf = new byte[4000];
  string s, s1;
  FileStream fp = System.IO.File.Open("filetmp.tmp", FileMode.Open);
  fp.Seek(0, SeekOrigin.Begin);
  fp.Read(buf, 0, buf.Length);
  int r = Console.Read();
  for (int i = 0; i < r; i++)
  {
  for (int n = 0; n < 20; n++)
  {
  fn[n] = buf[i * 24 + 4 + n];
  }
  fn [20]=0;
  string str = System.Text.Encoding.ASCII.GetString(fn);
  //str好象就是你要的结果了。
  for (int n = 0; n < 4; n++)
  {

  }
  }



这样还是不能显示汉字的 而且显示内容不全 希望继续补充

作者: pridescc   发布时间: 2011-06-16