现在有一个字符串
"wo,chulai9394,wojiuxihuan"
现在对方服务器要求这个字符串用基于socket的
Big Endian字节顺序发送。但是我转换byte数组的时候怎么也转不到他给我的例子:
1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516转化为
byte[] buf =[0, 54, 49, 44, 49, 48, 48, 49, 44, 50, 48, 48, 55, 48, 51, 48, 56, 49, 49, 48, 50, 48, 49, 44, 50, 53, 51, 57, 54, 50, 57, 55, 55, 69, 50, 53, 55, 68, 55, 48, 66, 56, 67, 57, 66, 48, 69, 70, 67, 57, 50, 65, 70, 53, 49, 54];请教这种Big Endian字节顺序的byte数组如何转化?

解决方案 »

  1.   

    我试了下,最接近的是这样,要不你在得到byte数组的基础上把前导0都去掉,再加上开头的0和54?
    string s = "1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516";
    byte[] bytes = Encoding.BigEndianUnicode.GetBytes(s);
    foreach (byte b in bytes)
    Response.Write(b + "<br/>");
      

  2.   

    不行,他开始的两个字节是后面报文的长度。我不知道他是怎么计算出来的,如果单单是他不要长度的那两个字节,那么Encoding.UTF8.GetBytes即可获取他想要的字节数组。他说C有现成的方式搞定,但是C#就不知道了
      

  3.   

    小Casestring strs = "1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516";
               byte[] byt = Encoding.ASCII.GetBytes(strs);           foreach (var v in byt)
                   Console.WriteLine(v);
      

  4.   

    我现在明白对方的意思
    byte[] buf =[0, 54, 49, 44, 49, 48, 48, 49, 44, 50, 48, 48, 55, 48, 51, 48, 56, 49, 49, 48, 50, 48, 49, 44, 50, 53, 51, 57, 54, 50, 57, 55, 55, 69, 50, 53, 55, 68, 55, 48, 66, 56, 67, 57, 66, 48, 69, 70, 67, 57, 50, 65, 70, 53, 49, 54];这个数组,头2个字节是后面整个报文的长度,用16进制表示,"1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516"这个字符串
    转化为byte[] buf =[0, 54, 49, 44, 49, 48, 48, 49, 44, 50, 48, 48, 55, 48, 51, 48, 56, 49, 49, 48, 50, 48, 49, 44, 50, 53, 51, 57, 54, 50, 57, 55, 55, 69, 50, 53, 55, 68, 55, 48, 66, 56, 67, 57, 66, 48, 69, 70, 67, 57, 50, 65, 70, 53, 49, 54];0,54就是他的长度封255,前面的零进一到长度65535,但是我不知道如何嵌入这样的长度信息到byte数组中,那个54的长度是出来了,但是如何化成0,54然后嵌入到该数组中呢?copyto是能嵌入,但是不知道怎么化成0,54
      

  5.   


                var str = "1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516";
                var bs = Encoding.ASCII.GetBytes(str);
                if (bs.Length >= char.MaxValue)
                {
                    Console.WriteLine("字符串太长");//如果大于等于char的最大值,前两字节就不能描述长度了
                }
                else
                {
                    var bytes = new byte[bs.Length + 2];
                    bytes[0] = (byte)(bs.Length / byte.MaxValue);
                    bytes[1] = (byte)(bs.Length % byte.MaxValue);
                    bs.CopyTo(bytes, 2);//得到最终数组bytes                //显示数组内容
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        Console.Write(bytes[i] + (i == bytes.Length-1  ? "" : ",")); ;
                    }            }
                Console.ReadKey(true);
      

  6.   

     。。弄错了一点,修正上面的if语句if (bs.Length >= char.MaxValue)为if (bs.Length > char.MaxValue)下意识的把char.MaxValue等于两字节能表示的个数65536了
      

  7.   

    byte.MaxValue也搞错了,也要修正            var str = "1,1001,20070308110201,253962977E257D70B8C9B0EFC92AF516";
                var bs = Encoding.ASCII.GetBytes(str);
                if (bs.Length > char.MaxValue)
                {
                    Console.WriteLine("字符串太长");
                }
                else
                {
                    var bytes = new byte[bs.Length + 2];
                    bytes[0] = (byte)(bs.Length / (byte.MaxValue + 1));
                    bytes[1] = (byte)(bs.Length % (byte.MaxValue + 1));
                    bs.CopyTo(bytes, 2);//得到最终数组bytes                //显示数组内容
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        Console.Write(bytes[i] + (i == bytes.Length-1  ? "" : ",")); ;
                    }            }
      

  8.   

    我有点好奇哦 BigEndian的概念是多字节的时候你那些字符即使用U8编码 big endian和little endian也是一样的结果
      

  9.   

     如果是BigEndian编码的,必定有一半的00,但显示没有,
     所以是单字节的编码方式的。
     其所谓的BigEndian,仅仅是对前两个描述长度的字节而言的
      

  10.   

    反编译的时候
                    byte[] bytes = new byte[]{0,53,49,44,49,50,51,44,50,48,49,49,48,56,50,55,49,53,49,54,49,51,44,50,48,50,67,66,57,54,
                                              50,65,67,53,57,48,55,53,66,57,54,52,66,48,55,49,53,50,68,50,51,52,66,55,48 };
                    byte[] newBytes = new byte[bytes.Length - 2];
                    bytes.CopyTo(newBytes, 1);
                    Console.WriteLine(Encoding.UTF8.GetString(newBytes));
    这样出错了?
      

  11.   


    复制的时候,应该是 bytes.CopyTo(newBytes,2)吧?再者,用UTF-8来编码这个数组,不一定能成功,因为UTF-8的编码中,不一定有你传进去的一个、两个或者三个字节对应的字。就像如果长度为偶数的byte[],一定可以通过unicode编码,但如果长度为奇数,一定报错
      

  12.   

    感谢前辈的指导。。但是现在来了个我头痛的很的问题,调试都不知道问题出在那里。
    http://topic.csdn.net/u/20110901/09/5d7709d4-3e03-4772-b45c-9927e6c6da2e.html
    这个问题更加让我摸不到头脑。