本帖最后由 xx_mm 于 2010-05-16 21:10:21 编辑

解决方案 »

  1.   

    用Encoding.Default.GetString(dataArray)就能得到你的乱码。
      

  2.   

    在byte数组中存入的就是这样,就想用java代码中的流把数据库中的数据存入一个txt文件中一样,你可以用Encoding.Default.GetString(dataArray)把byte中的值读取出来!
      

  3.   

    嗯,确实,可我不知道一个byte类型数组就这么行,得到的竟然是乱码?明明数组里存的是一些小于255的数字丫? 怎么会这样呢????
      

  4.   

    原因就是你要去看编码标准
    例如utf-8
    http://www.utf8.com/像utf-8就是一个汉字三个字节。你可以
    for(int i=1;i<10000;i++)
                {
                    Console.WriteLine((char)i);
                }看看都出来什么字符。
      

  5.   


    还是不明白!!uft-8编码一个汉字三个字节,可是系统默认的Default是GB2312 ,我不明白为什么byte类型转化为字符串就变成乱码?原理是什么?
    那根
    for(int i=1;i<10000;i++)
      {
      Console.WriteLine((char)i);
      }
    也没关系啊??!!
      

  6.   

    你存的是二进制文件,却用文本编辑器打开,自然不行了,用专门的二进制文件查看器去看,不就是正常的了吗。
    http://dl.pconline.com.cn/html_2/1/59/id=6368&pn=0&linkPage=1.html
      

  7.   

    我也不知道怎么给你解释。
                string teststring = "大家看看这段代码,为何得到这种结果?";
                Byte[] testbuffer = Encoding.UTF8.GetBytes(teststring);
                File.Delete("test.txt");
                FileStream fs = new FileStream("test.txt", FileMode.OpenOrCreate);
                fs.Write(testbuffer, 0, testbuffer.Length);
                byte[] newline = Encoding.UTF8.GetBytes("\r\n");
                foreach (Byte testbyte in testbuffer)
                {
                    fs.Write(newline, 0, newline.Length);
                    string testbytestring = testbyte.ToString();
                    byte[] testbytevalue = Encoding.UTF8.GetBytes(testbytestring);
                    fs.Write(testbytevalue, 0, testbytevalue.Length);
                }
                fs.Close();这个文件输出时什么?
    大家看看这段代码,为何得到这种结果?
    229
    164
    167
    229
    174
    182
    231
    156
    139
    231
    156
    139
    232
    191
    153
    230
    174
    181
    228
    187
    163
    231
    160
    129
    239
    188
    140
    228
    184
    186
    228
    189
    149
    229
    190
    151
    229
    136
    176
    232
    191
    153
    231
    167
    141
    231
    187
    147
    230
    158
    156
    239
    188
    159也就是说229
    164
    167这三个byte构成了"大"这个字。至于这个为什么会是这样,怎么是这样,是人家utf-8标准定制。你只需要知道就行。
      

  8.   


    是谁告诉你是小于255的数字的?晕啊,恕我直言:基础知识了的你的一个NextBytes,直接产生0到65535间的数字,一个Byte(字节)有8个bit(比特),一般英文单词只占一个word(字)也就是4位bit,也就是说你把他们合并到流中时,他们就以数据的形式保存(此例便是),有入口函数的就以命令形式保存,这个就是以你的流写成的数据,你用文本打开,记事本程序会以对应编码翻译每字节,如果值太大或太小(不在编码范围内的)就会轮空,自然出现乱码了,这个是数据存储的形式和编码是什么没有关系,和你拿记事本开exe文件一样的。这个汇编语言第一章都有说看看吧。
      

  9.   


    byte是8位的,你用记事本读的时候可能是16位的,比如你存的是 "ABC" 三个字符 系统保存的二进制可能就是"00123456 00234567 00345678"(假设)你在用记事本读的时候,他默认用16进制读,一次读两个字节,"00123456 00234567"这段二进制代码在16进制的字符库里可能代表符号"憈", "00345678"不够16位,系统自动补0补够16位,得到的二进制可能代表的是"賄"
    所以你存进去的字符"ABC",换个编码就成了"憈賄"了,其实磁盘上存的还是那些二进制数据,是不会变的.只是你用的编码库显示的时候将他们转换了一下
      

  10.   

    睡了一觉,更加清醒了,把语言整理了一下,更加直白:
    在生成的byte,如随机出了97和98,也就是这个时候流的值为61h和62h,通常编码查询的时候应该分别为小写的'a'和'b'才对。然而,你的流中没有明显的标示说只取一个字节(正常的编码中都有是否取单字节标示),很多编码是双字节d读取的(如汉字),也就是读取一个字单元的,它会把61h当低位62h当高位读出6261h也就是25185这个码,然后会以这个码到码表中查找,如果超出了范围,自然是乱码了。ps:今后酒后不回帖了
      

  11.   

    呵呵~~ 谢谢大哥了~ 可这句话不懂:它会把61h当低位62h当高位读出6261h也就是25185这个码~~ 别见笑哦~还有这句:流的值为61h和62h,怎么来的~ 
      

  12.   

    带h的说明是16进制,如果是6E h的话可能你会更加明白些,字单元是由两个字节组成,在内存中前边的8位bit(也就是前边的byte)叫低位,后边的byte叫高位,也是人们常说的高8、低8在内存中是先存低位、再存高位:
    例如:十进制:270  应该写成十六进制: 010E
    但是再内存中,他是以 0E 01 方式排的,就是低位在前,高位在后PS:如果还想了解详细的话,建议买本汇编语言的书看一下,会给你的思想有许多启发,真的,感觉约束少了清爽了许多,世界一下美好了起来。废话完。