/*
* main.c
*/
#include <stdio.h>
#include <string.h>
#define CY_VAP_TSC "vap.dat"
typedef struct DetectorInfo_t
{
unsigned char DetectorId;
unsigned char Distance; //线圈离停止线距离
unsigned char Length; //线圈长度,宽度默认为车道宽度;
unsigned char Type; //取值:1: 排队检测器,2:搭接检测器, // 3:清空检测器,4:锁死检测器,// 5:溢出检测器;
unsigned char Headway;
unsigned char Occupation;
} DetectorInfo_t;
typedef struct ChannelId_t
{
unsigned char ChannelId;
unsigned char ChannelDir; //1:北向南直行,2:东向西直行…….
unsigned char ChannelType;//
DetectorInfo_t astDetectInfo[32];//保存检测器信息
} ChannelId_t;
typedef struct PhaseListVAP_t
{
unsigned char PhaseId;
unsigned char PhaseWalkGreen;
unsigned char PhaseWalkClear;
unsigned char PhaseMinGreen1;
unsigned char PhaseMinGreen2;
unsigned char PhaseMinGreen3;
unsigned char PhaseGreenDelay;
unsigned char PhaseMaxGreen1;
unsigned char PhaseMaxGreen2;
unsigned char PhaseMaxGreen3;
unsigned char PhaseFixGreen;
unsigned char PhaseGreenFlash;
unsigned char PhaseType;
unsigned char PhaseSpecFunc;
unsigned char PhaseReserved;
ChannelId_t astChannel[32];//保存当前相位的通道属性
} PhaseListVAP_t;
typedef struct PhaseVAP_t
{
unsigned char AllRedTime;
unsigned char FactPhaseNum;
PhaseListVAP_t PhaseListVAP[32];
} PhaseVAP_t;
int main(void) {
PhaseVAP_t stphase;
memset(&stphase,0,sizeof(stphase));
// stphase.AllRedTime = 5;
stphase.FactPhaseNum = 2;
stphase.PhaseListVAP[0].PhaseId = 1;
stphase.PhaseListVAP[0].PhaseWalkGreen = 5;
stphase.PhaseListVAP[0].PhaseWalkClear = 3;
stphase.PhaseListVAP[0].PhaseMinGreen1 = 13;
stphase.PhaseListVAP[0].PhaseMinGreen2 = 23;
stphase.PhaseListVAP[0].PhaseMinGreen3 = 33;
stphase.PhaseListVAP[0].PhaseGreenDelay = 3;
stphase.PhaseListVAP[0].PhaseMaxGreen1 = 15;
stphase.PhaseListVAP[0].PhaseMaxGreen2 = 25;
stphase.PhaseListVAP[0].PhaseMaxGreen3 = 35;
stphase.PhaseListVAP[0].PhaseFixGreen = 30;
stphase.PhaseListVAP[0].PhaseGreenFlash = 3;
stphase.PhaseListVAP[0].PhaseType = 32;
stphase.PhaseListVAP[0].PhaseSpecFunc = 96;
stphase.PhaseListVAP[0].PhaseReserved = 0;
stphase.PhaseListVAP[0].astChannel[0].ChannelId = 1;
stphase.PhaseListVAP[0].astChannel[0].ChannelDir = 1;
stphase.PhaseListVAP[0].astChannel[0].ChannelType = 1;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[0].DetectorId = 1;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[0].Headway = 5;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[0].Occupation = 25;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[0].Type = 1;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[1].DetectorId = 2;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[1].Headway = 3;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[1].Occupation = 20;
stphase.PhaseListVAP[0].astChannel[0].astDetectInfo[1].Type = 3;
stphase.PhaseListVAP[1].PhaseId = 2;
stphase.PhaseListVAP[1].PhaseWalkGreen = 5;
stphase.PhaseListVAP[1].PhaseWalkClear = 3;
stphase.PhaseListVAP[1].PhaseMinGreen1 = 15;
stphase.PhaseListVAP[1].PhaseMinGreen2 = 24;
stphase.PhaseListVAP[1].PhaseMinGreen3 = 34;
stphase.PhaseListVAP[1].PhaseGreenDelay = 3;
stphase.PhaseListVAP[1].PhaseMaxGreen1 = 16;
stphase.PhaseListVAP[1].PhaseMaxGreen2 = 26;
stphase.PhaseListVAP[1].PhaseMaxGreen3 = 36;
stphase.PhaseListVAP[1].PhaseFixGreen = 30;
stphase.PhaseListVAP[1].PhaseGreenFlash = 3;
stphase.PhaseListVAP[1].PhaseType = 32;
stphase.PhaseListVAP[1].PhaseSpecFunc = 96;
stphase.PhaseListVAP[1].PhaseReserved = 0;
stphase.PhaseListVAP[1].astChannel[0].ChannelId = 3;
stphase.PhaseListVAP[1].astChannel[0].ChannelDir = 1;
stphase.PhaseListVAP[1].astChannel[0].ChannelType = 1;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[0].DetectorId = 3;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[0].Headway = 5;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[0].Occupation = 25;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[0].Type = 1;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[1].DetectorId = 4;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[1].Headway = 3;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[1].Occupation = 20;
stphase.PhaseListVAP[1].astChannel[0].astDetectInfo[1].Type = 3;
FILE *nfp = NULL;
nfp = fopen(CY_VAP_TSC,"wb+");
if (NULL == nfp)
{
printf("open vap file error,File: %s,Line: %d\n",__FILE__,__LINE__);
return 0;
}
fwrite(&stphase,sizeof(stphase),1,nfp);
fclose(nfp);
printf("The End sizeof:%d\n",sizeof(stphase));
return 0;
}
你得先知道这个 .dat 里面的数据是用什么方式(protobuf, boost,mfc,等等)将typedef 定义的struct 序列化的.
然后可以选择用c写一个反序列化的实现. 然后给nodejs去调用. 如果是语言无关的序列话 大概可以在nodejs里面找到对应的组件.
大佬,我补充了一下问题,加了.c的文件输出,我不是很懂这个问题,nodejs用的不多,麻烦多看两眼
@古德拉克:
参考代码哈:
// nodejs
let datFileBytes:Buffer = get bytes from dat file;
let stphase={};
stphase.AllRedTime = datFileBytes.tostring(undefined,0,1) //读取第一个字节.
stphase.FactPhaseNum=datFileBytes.tostring(undefined,1,1) //读取第第二个节.
//FYI unsigned char 类型是一个byte. 剩下的字段你就挨个读取. 可能要注意大小端(字节对齐)的问题.
更好的办法是, 用c++写个dll然后在nodejs里面直接调用.