c#接收c语言的数据源,转换为byte数组 然后转换成结构体,做过的帮忙看看 谢谢!

SomethingJack 2015-12-17 02:26:50
c的结构体如下:

typedef struct tagSta_Record
{
//char time_stamp[23];
float av_speed[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
uint8 vloume[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
float occuancy[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
//float headway[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
//float _85_speed[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
//BYTE is_offline[][][];
}STA_RECORD;


我写的转换DEMO ,不太懂,所以发上来大家帮忙看看,没有得到想要的结果

static void Main(string[] args)
{
//这是接收到的数据源
string str = "CA CB CC CD 01 82 60 03 00 00 00 00 00 00 80 3F 00 00 00 40 00 00 80 3F 00 00 00 40 00 00 40 40 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 80 3F 00 00 00 40 00 00 40 40 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 10 41 00 00 20 41 00 00 30 41 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 10 41 00 00 20 41 00 00 30 41 00 00 20 41 00 00 30 41 00 00 40 41 00 01 02 01 02 03 02 03 04 03 04 05 04 05 06 05 06 07 06 07 08 07 08 09 01 02 03 02 03 04 03 04 05 04 05 06 05 06 07 06 07 08 07 08 09 08 09 0A 02 03 04 03 04 05 04 05 06 05 06 07 06 07 08 07 08 09 08 09 0A 09 0A 0B 03 04 05 04 05 06 05 06 07 06 07 08 07 08 09 08 09 0A 09 0A 0B 0A 0B 0C 00 00 00 00 00 00 80 3F 00 00 00 40 00 00 80 3F 00 00 00 40 00 00 40 40 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 80 3F 00 00 00 40 00 00 40 40 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 00 40 00 00 40 40 00 00 80 40 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 10 41 00 00 20 41 00 00 30 41 00 00 40 40 00 00 80 40 00 00 A0 40 00 00 80 40 00 00 A0 40 00 00 C0 40 00 00 A0 40 00 00 C0 40 00 00 E0 40 00 00 C0 40 00 00 E0 40 00 00 00 41 00 00 E0 40 00 00 00 41 00 00 10 41 00 00 00 41 00 00 10 41 00 00 20 41 00 00 10 41 00 00 20 41 00 00 30 41 00 00 20 41 00 00 30 41 00 00 40 41 00 00";
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
StructDemo StructDemo1 = (StructDemo)ByteToStruct(bytes, typeof(StructDemo));
}

//将Byte转换为结构体类型
public static object ByteToStruct(byte[] bytes, Type type)
{
int size = Marshal.SizeOf(type);
if (size > bytes.Length)
{
return null;
}
//分配结构体内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷贝到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
return obj;
}
...全文
294 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-12-18
  • 打赏
  • 举报
回复
你给出的结构有误!
本拉灯 2015-12-18
  • 打赏
  • 举报
回复
float av_speed[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM]; uint8 vloume[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM]; float occuancy[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM]; 这不都有长度了么 在C#里面一个float就是4个字节 , ARS_MAX_MEASURELINE_NUM 这里面的参数就是这个数组的定长,你可以算一下呗,就能得出每个数组的总长了,
Poopaye 2015-12-17
  • 打赏
  • 举报
回复
你是说c语言那边都是float? 好吧,那接收到的数据究竟是什么类型的?
SomethingJack 2015-12-17
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
无语,楼主你自己查查uint8是什么
不是 那个是我写错了 都是float类型的
引用 6 楼 shingoscar 的回复:
无语,楼主你自己查查uint8是什么
跟C语言那边对应
Poopaye 2015-12-17
  • 打赏
  • 举报
回复
无语,楼主你自己查查uint8是什么
SomethingJack 2015-12-17
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
StructDemo 这是啥玩意思。
希望得到就是 一个结构体 里面已经有了想要的参数 实际结构体也是一个类嘛 下位机发过来的
SomethingJack 2015-12-17
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
StructDemo 这是啥玩意思。
这是c#的结构体.

 public struct StructDemo 
    {
        //[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM] new int[] { 1, 3, 5 }, new int[] { 2 }, new int[] { 4, 8 }
        //char time_stamp[23];
        float[, ,] av_speeddata;
        uint[, ,] vloume;
        float[, ,] occuancy;
        // float[, ,] av_speeddata = new float[4, 8, 2];
        //uint vloume[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
        //float occuancy[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
        //float headway[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
        //float _85_speed[ARS_MAX_MEASURELINE_NUM][ARS_MAX_LANE_NUM][ARS_MAX_VEHICLETYPE_NUM];
        //BYTE is_offline[][][];

        public StructDemo (float[, ,] _av_speeddata, uint[, ,] _vloume, float[, ,] _occuancy)
        {
            this.av_speeddata = _av_speeddata;
            this.vloume = _vloume;
            this.occuancy = _occuancy;
        }
    }
本拉灯 2015-12-17
  • 打赏
  • 举报
回复
StructDemo 这是啥玩意思。
忘丿殇 2015-12-17
  • 打赏
  • 举报
回复
byte[] 数组反序列化为结构体~~~应该是可以的
Poopaye 2015-12-17
  • 打赏
  • 举报
回复
思路是对的,但是一开始就错了 string str = "CA" byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str); 这个转出来不是你想要的结果 要这样转 str.Split(' ').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray();

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧