问题如下:
有个byte[]数组b,内容是96 3F 62 C9 4E 01, 如果用Encoding.BigEndianUnicode.getString(b)去做的话,是中文“阿拉丁”3个字现在用其他的编码方式转换为字符串,比如:string str = Encoding.ASCII.GetString(b);
当再用相同的编码方式转换为数组:byte[] b1 = Encoding.ASCII.GetBytes(str);
则 b1和b的内容不同了。 
用Encoding.Default, Encoding.getEncoding("GB2312"), Encoding.UTF7, Encoding.UTF8等编码转换后,数组的内容都变了请问: 有什么方法,可以让相同编码转换后,得到的数据内容相同?  (不能用Encoding.BigEndianUnicode)

解决方案 »

  1.   

    那麻烦了,我做的操作是从cdma wavecom中读出收到的短信数据。因为 从串口中读出的数组很长,除了96 3F 62 C9 4E 01 是 BigEndianUnicode编码的,其他都是普通的ascii字符,读出的数组需要转换为string后,进行分析,比如“+cmgs:”表示为短信发送成功,“+cmti:"标示为收到短信等等。如果全部用BigEndianUnicode转换为string,那么除了“阿拉丁”外,其他的都是乱码。
    如果用default或者ascii转换为string,那么“阿拉丁”这3个字就再也不能还原了。不知道 有没有高手做过 cdma短信编程,可以解决这个问题?
      

  2.   

    shalen520:我的想法是: 用同一种编码 转换2次后,应该还原才对,但实际操作不是这样的,我很困惑
      

  3.   

    GSM的做过,其实就是UTF-16,每四个字节解出一个字符,CDMA不清楚,估计是类似的
      

  4.   

                byte[] b = Encoding.GetEncoding("GB2312").GetBytes("中国奥运会");
                string s = Encoding.GetEncoding("GB2312").GetString(b);            Console.WriteLine(s);显示"中国奥运会"
      

  5.   

    wdgphc,非常感谢你关注本问题。但你的方法和我的不相同,我是先GetString,再GetBytes。
    你可以试试,先用
    byte[] b = Encoding.BigEndianUnicode.GetBytes("中国奥运会");
    得到一个数组然后再把这个数组用
    string s = Encoding.GetEncoding("GB2312").GetString(b);
    得到字符串
    再用byte[] b1 = Encoding.GetEncoding("GB2312").GetBytes(s);
    得到数组去比较b和b1的内容是否相同
      

  6.   

    我觉得问题的根本所在是其他的编码形式,没有字去标示96 3F 62 C9 4E 01这样的数组。造成还原的时候内容也不相同?
      

  7.   

    我知道了,可能是混合编码的,英文字符用UTF-8,中文用了PDU来编码,需要判断字符是不是PDU编码,然后一个一个字符的用相应编码解码
      

  8.   


    为什么收到的数据中会有BigEndianUnicode和ascii两种编码?怎么区分这两种编码?如果知道分界在哪里,就分别用这两种编码处理好了。
      

  9.   

                byte[] b = Encoding.BigEndianUnicode.GetBytes("奥运会");   //先用BigEndianUnicode编码
                string s = Encoding.GetEncoding("GB2312").GetString(b);       //用 GB2312 解码
                byte[] y = Encoding.GetEncoding("GB2312").GetBytes(s);        //再用GB2312编码            Console.WriteLine(b.Length.ToString() + " " + y.Length.ToString());  //输出2种都是6个字节            for (int i = 0; i < b.Length; i++)
                    Console.WriteLine((b[i] == y[i]) ? "OK" : "Wrong");  //输出6个OK ,说明每个字节都是一样的.
     
      

  10.   

    读出的字符串是这样的:
    +CMGR:"REC UNREAD","13777831205", "08/09/19,11 :48 :15",0,4,0,6
    ?b蒒
    OK
    其中 ?b蒒 这堆乱码,用ascii去看是 96 3F 62 C9 4E 01。而96 3F 62 C9 4E 01 只有用BigEndianUnicode能显示“阿拉丁”,其他的编码都不能正常显示如果把这整个串都用BigEndianUnicode去转换的话,那其他的字符串就不能认识了
      

  11.   

    wdgphc, 你把奥运会换成 阿拉丁 试试
      

  12.   


    读出的原始的byte[]是什么?贴出来看看。
      

  13.   

    原始的数组是:
    0D 0A 2B 43 4D 47 52 3A 22 52 45 43 20 55 4E 52 45 41 44 22 2C 22 31 33 37 37 37 38 33 31 32 30 35 22 2C 
    22 30 38 2F 30 39 2F 31 39 2C 31 31 20 3A 34 38 20 3A 31 35 22 2C 30 2C 34 2C 30 2C 36 0D 0A 96 3F 62 C9 4E 01 0D 0A 4F 4B 0D 0A 
      

  14.   

    你的CDMA编程难道没用dll,ocx, demo或说明书 吗?
      

  15.   

    http://www.codeproject.com/KB/mobile/smspdulib.aspx试试这个库
      

  16.   

    wdgphc: 不是发送方把一个字符串弄成混合编码,而是cdma的at指令就是这么定义的。除了内容是BigEndianUnicode的,其他全是ascii的7.7 Read message +CMGR
    7.7.1 Description :
    This command allows the application to read stored messages. The messages are read from the
    memory selected by +CPMS command.
    7.7.2 Syntax :
    Command syntax : AT+CMGR=<index>
    Response syntax:
    +CMGR :<stat>,<oa>, <scts>,<lang>,<encod>,<priority>[,<cbn>]<CR><LF> <data> (for SMSDELIVER
    only)
    +CMGR : <stat>,<da>,<dt>,<lang>,<encod><priority>[,<cbn>]<CR><LF> <data> (for SMS-SUBMIT
    only)
    +CMGR : <stat>,<mr>,<scts>,<dt>,<st> (for SMS-STATUS-REPORT only)
    A message read with status “REC UNREAD” will be updated in memory with the status “REC
    READ”.
    Note :
    the <stat> parameter for SMS Status Reports is always “READ”.Example : AT+CMGR=1
    Possible responses: +CMGR: “REC UNREAD”,”8585551212”,”98/10/01,18 :22 :11+00”,1,2,0,”8585550000”<CR><LF>ABCdefGHIOK
    7.7.3 Defined values
    <stat> Status of message in memory.
    <oa> : Origination Address Value in string format.
    <scts>: Service Center Time Stamp in string format
    <lang>: Language.
    <encod>: Encoding
    <priority>: Message priority:
    0 – NORMAL
    1 – INTERACTIVE
    2 – URGENT
    3 – EMERGENCY
    <cbn>: Call Back Number
      

  17.   

    wdgphc、shalen520 : 我用的是at指令,最底层的应用,不需要dll、ocx等封装的程序
      

  18.   

    shalen520: 你给的这个库,是普通的gsm 短信的 pdu 格式,这个我早就开发完毕了。现在是在用cdma的短信,cdma用的不是pdu格式。 从at指令at+cmgf=1可以看出来。at+cmgf=0 是pdu
    at+cmgf=1 是txt模式, cdma用的是at+cmgf=1
      

  19.   

    明白了,既然定义就是而是cdma的at指令就是这么定义的。 除了内容是BigEndianUnicode的,其他全是ascii的 
    那就按照这个格式去解析不就对了吗? 分段解析.
      

  20.   

    那么,如何分析
    0D 0A 2B 43 4D 47 52 3A 22 52 45 43 20 55 4E 52 45 41 44 22 2C 22 31 33 37 37 37 38 33 31 32 30 35 22 2C 22 30 38 2F 30 39 2F 31 39 2C 31 31 20 3A 34 38 20 3A 31 35 22 2C 30 2C 34 2C 30 2C 36 0D 0A 96 3F 62 C9 4E 01 0D 0A 4F 4B 0D 0A
    这段数组中哪段是BigEndianUnicode?