我的應用程式由一個具有多個子項的控制器組成。控制器使用管道與第一個孩子進行通信,孩子在我們之間使用管道將問題轉移到下一個兄弟姐妹。當孩子可以處理問題時,它會向控制器管道發送一個幀以進行無罪釋放。
我的問題是因為每個孩子都可以在控制器管道中寫入,控制器可能會在同一個流中讀取多個孩子的幀。
所以,我想拆分這個流來處理子幀個體。
控制器只接收一種型別的幀:
Acquittal Frame
0 1 2 3
0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8
- - - - - - - - - - - - - - - - - - - - - - - - - - -
| CMD | NODE ID | ERROR FLAG |
- - - - - - - - - - - - - - - - - - - - - - - - - - -
| DATA LENGTH (optional) | |
- - - - - - - - - - - - - - - - - - |
| DATA WITH UNDETERMINED SIZE (char *) (optional) |
- - - - - - - - - - - - - - - - - - - - - - - - - - -
| END FRAME |
- - - - - - - - -
該框架由多個資訊組成:
- CMD : 對問題孩子回應的負責人說的無罪表揚
- NODE ID : 孩子的唯一識別符號
- 錯誤標志:在結果和命令的函式中可以有不同的值
命令:
- A_SET(0xA2) :
- 該命令只承認 2 個錯誤標志 SUCCESS(0x20) 和 INTERNAL_ERROR(0x50)
- 使用此 cmd,幀大小為 4,無資料長度和資料
- A_DUMP(0xD2) :
- 該命令只承認 2 個錯誤標志 SUCCESS(0x20) 和 INTERNAL_ERROR(0x50)
- 使用此 cmd,幀大小為 4,無資料長度和資料
- A_LOOKUP(0xB2) :
- 如果此命令具有錯誤標志 INTERNAL_ERROR(0x50) 或 NOT_FOUND(0x44),則幀大小將為 4
- 如果此命令具有錯誤標志 SUCCESS(0x20),則幀大小將為 4 DATA LENGTH,以兩個位元組進行編碼
所以在我的例子中,我想要這個:
{0xd2,0x04,0x20,0x04,0xd2,0x05,0x20,0x04,0xd2,0x06,0x20,0x04,0xd2,0x07,0x20,0x04,0xb2,0x08,0x20,0x01,0x08,0x62,0x6f,0x6e,0x6a,0x6f,0x75,0x72,0x04}
我想提取一個看起來像這樣的陣列:
[0] : {0xd2,0x04,0x20,0x04}
[1] : {0xd2,0x05,0x20,0x04}
[2] : {0xd2,0x06,0x20,0x04}
[3] : {0xd2,0x07,0x20,0x04}
[4] : {0xb2,0x08,0x20,0x01,0x08,0x62,0x6f,0x6e,0x6a,0x6f,0x75,0x72,0x04}
我嘗試了多種方法來做到這一點:使用手動陣列跑酷,使用 strtok() 函式。所以,我在這里向您展示了 stork 函式的最后一次嘗試:
enum frameComponents {
END_FRAME=(unsigned char)0x04,
...
}
...
unsigned int getNbFrames(unsigned char * framesStream){
unsigned int lenFrames = strlen((char * )framesStream);
unsigned int i,k;
for(i=0,k=0;i<lenFrames;i ){
if(framesStream[i]==END_FRAME){
k ;
}
}
return k;
}
unsigned char ** deserialisation(unsigned char * frameStream){
//this function return the number of identify frame in the stream
unsigned int nbFrame = getNbFrames(frameStream);
unsigned int lenFrames = strlen((char * )frameStream);
unsigned char **framesArray = malloc(nbFrame * sizeof(unsigned char *));
unsigned char *tempFrameStream = malloc(sizeof(unsigned char)*lenFrames 1);
unsigned char * extractedFrame = (unsigned char *) strtok(tempFrameStream, (char *)END_FRAME);
strcpy((char *)tempFrameStream,(char *) frameStream);
int i = 0;
while(extractedFrame != NULL ) {
extractedFrame = (unsigned char *) strtok(NULL, (char *)END_FRAME);
framesArray[i]= malloc(strlen((char *)extractedFrame) 1);
strcpy((char *)framesArray[i],(char *)extractedFrame);
i ;
}
free(tempFrameStream);
free(extractedFrame);
return framesArray;
}
但我在這里有多個問題
首先, strtok() 似乎無法正常作業,因為當我嘗試使用一個字串時,我的陣列中回傳空值。我不知道這是否來自我陣列的 unsigned int 型別?
其次,當我嘗試訪問函式外的幀陣列時,出現分段錯誤。即使在我的陣列中使用 malloc()
uj5u.com熱心網友回復:
由于您的輸入資料不是字串而是原始位元組流(又名無符號字符流),因此您不能將字串函式用于解碼器。
您需要實作一個將協議考慮在內的決議器,即您需要查看每個幀并查看它是什么命令。一旦你知道命令,你就可以相應地決議資料。
我不會為你實作一個完整的決議器,但下面是一些顯示主體的代碼。代碼不會將幀放入分配的記憶體中(我將把它留給你),代碼只是列印幀(在 3 種情況下的 2 種情況下,最后一種我會留給你實作。
#define A_SET (0xA2)
#define A_DUMP (0xD2)
#define A_LOOKUP (0xB2)
void deserialisation(unsigned char * frameStream, size_t n)
{
size_t index = 0;
while (index < n)
{
switch(frameStream[index])
{
case A_SET:
if (index 4 > n)
{
puts("Too little data! can't continue...");
index = n;
}
else
{
// Good frame - just print it for now
printf("A_SET cmd: ");
for (size_t i = 0; i < 4; i) printf("0xX ", frameStream[index i]);
puts("");
index = 4;
}
break;
case A_DUMP:
if (index 4 > n)
{
puts("Too little data! can't continue...");
index = n;
}
else
{
// Good frame - just print it for now
printf("A_DUMP cmd: ");
for (size_t i = 0; i < 4; i) printf("0xX ", frameStream[index i]);
puts("");
index = 4;
}
break;
case A_LOOKUP:
printf("A_LOOKUP cmd: ");
// Add code here...
break;
default:
puts("Unknow frame! Can't continue...");
index = n;
break;
}
}
}
int main(void)
{
unsigned char pipeData[] = {0xA2, 0x01, 0x20, 0x04, 0xD2, 0x14, 0x50, 0x04};
deserialisation(pipeData, sizeof pipeData / sizeof pipeData[0]);
return 0;
}
輸出:
A_SET cmd: 0xA2 0x01 0x20 0x04
A_DUMP cmd: 0xD2 0x14 0x50 0x04
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324793.html
下一篇:帶模的for回圈的運行時復雜度
