用C#把MySQL的数据读出,数据类型在MySQL下为char(15) binary, 在C#下读出自然是Object类型.
这15字节的数据是以下结构体的数据:(C版本)
typedef struct _ITEM
{
    unsigned long           ID;                 
    unsigned int            BaseIDx;             
    unsigned char           pp;                 
    unsigned char           ttribx[5];          
    unsigned char           Status;             
} ITEM;
求教高手:
1.如何把这个Object的15字节的数据分离出来.
2.如果ttribx是个Big5编码的字符串,如何处理比较好,因为.net默认为Unicode.

解决方案 »

  1.   

    public struct Item
    {
    public long ID;                 
    public int BaseIDx;             
    public char pp;                 
    public char ttribx;          
    public char Status;
    }Item item = new Item();
    // 假设你的二进制数据已经放在byte[] buffer里
    item.ID = BitConverter.ToInt64(buffer, 0);
    item.BaseIDx = BitConverter.ToInt32(buffer, 8);
    item.pp = buffer[12];
    item.ttribx = buffer[13]
    item.Status = buffer[14]
      

  2.   

    所有,谢谢楼上那位,可是ttribx是字符串啊,而且便宜地址好像出错
      

  3.   

    public struct Item
    {
    public long ID;                 
    public int BaseIDx;             
    public string pp;                 
    public char ttribx;          
    public char Status;
    }Item item = new Item();
    // 假设你的二进制数据已经放在byte[] buffer里
    item.ID = BitConverter.ToInt32(buffer, 0);
    item.BaseIDx = BitConverter.ToInt32(buffer, 4);
    item.pp = Encoding.UTF8.GetString(buffer,8,5);
    item.ttribx = buffer[13];
    item.Status = buffer[14];
      

  4.   

    谢谢楼上,不过,好像你还是把数组位置弄错了.不过我知道怎么解决了.还有一个问题是,如何把Object 类型的数据分裂成byte[]?
    在次感谢
      

  5.   

    byte[] xx=(byte[])yourobject;//???
      

  6.   

    string str = "lalalala";
    Object yourobject = (Object)str;
    byte[] xx=(byte[])yourobject;
    你执行的时候会出现异常.
      

  7.   

    如果是String类型可以分裂为byte,都是如果有中文之类的会出现错误,转换不过来的unicode用"?"表示.所有把Object转换成String在分裂是不行的,还有一个主要原因是,如果,比如BaseIDx=0,那么String是否会认为已经到了字符结尾.
      

  8.   

    对于字符串你可以:
    string str = "lalalala";
    Object yourobject = (Object)str;
    byte[] xx= Encoding.UTF8.GetBytes(str);对于复杂的object,你可以直接用二进制序列化:
    MyObject obj = new MyObject();  // 你的类MyObject需要[Serializable]
    obj.n1 = 1;
    obj.n2 = 24;
    obj.str = "一些字符串";
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    formatter.Serialize(stream, obj);
    byte[] xx = stream.GetBuffer();
    stream.Close();
      

  9.   

    用序列化的方法也不行啊,序列化会改变数据格式.
    string str = "asdfghjk";
    Object obj = (Object)str;IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    formatter.Serialize(stream, obj);
    byte[] xx = ((MemoryStream)stream).GetBuffer();
    stream.Close();
    会序列为长度为256的byte数组!多数为0,还有一些无用的前后缀,比如255
      

  10.   

    回复人: yanyiyun(风之泪) ( ) 信誉:100  2005-04-11 09:09:00  得分: 0  
     
     
       谢谢楼上,不过,好像你还是把数组位置弄错了.不过我知道怎么解决了.还有一个问题是,如何把Object 类型的数据分裂成byte[]?
    在次感谢
      
     
    System.text.encoding.default.getbytes((String)yourobject)
      

  11.   

    主要问题是,这样处理的化,如果有某个双字节(即,2n和2n+1,n为正整数)为00 00,那个回判断这个字符串结束啊!
      

  12.   

    unsigned char           ttribx[5];
    是string
      

  13.   

    可是在C++里边sizeof的时候,他只有5个字节,没有结束符,相当于5个byte
      

  14.   

    回复人: yanyiyun(努力做中国人的游戏) ( ) 信誉:100  2005-04-13 09:01:00  得分: 0  
     风之泪是你的同事?同学?还是马甲?早先没仔细看!我昨天晚上不是给出测试结果了么?就在你的那个帖子里!
      

  15.   

    可以在2进制里放上string长度就完了
      

  16.   

    xxuu503 谢谢你那题的回答.我解决了.现在这个问题的目的已经是想了解,如何把一个从数据库提取出来的Object转换成为byte[].
      

  17.   

    System.text.encoding.default.getbytes((String)yourobject)我是这样子想的,先把Object类型转化为String类型,然后Getbytes转为byte数组!尝试一下吧!应该不花多少时间的!
      

  18.   

    我觉得String和Byte[]在内存上是一样的!
      

  19.   

    测试一下吧,只要看看,得出的byte数组的第15字节是不是Status的值就可以了