2014-11-03 51 views
0

由於大部分球員都知道誰與SCSI工作,如果發出一個SCSI命令,該設備可以返回與附加信息的所謂意義上的代碼。SCSI意義的字符串

基本上你有3個號一起有一個含義。

這裏是維基百科的清單: http://en.wikipedia.org/wiki/Key_Code_Qualifier

我需要有一個函數,它接受這3個數字,並確定哪些錯誤發生,並返回基於其字符數組。 我一直在想一個很好的方法來做到這一點。分支if語句顯得如此unelegant ...

我不知道是否有一個簡單的方法來做到這一點沒有一些複雜的功能。

回答

1

嵌套的開關,你可以爲這種問題最糟糕的事情。查找表要簡單得多。你可能需要像這樣的東西:

struct SCSILookupTableElement 
{ 
    unsigned char key; 
    unsigned char asc; 
    unsigned char ascq; 
    const char *errorcondition; 
} SCSILookupTable[] = 
{ 
    { 0, 0, 0,  "No error"}, 
    { 0, 0x5d, 0,  "No sense - PFA threshold reached"}, 
    { 1, 1, 0,  "Recovered Write error - no index"}, 
    ... 
    {0xff, 5, 0,  "Illegal request"} // 0xff stands for X 
    ... 
}; 


const char *SCSIErrortext(int key, int asc, int ascq) 
{ 
    int i ; 
    for (i = 0; i < sizeof(SCSILookupTable)/sizeof(struct SCSILookupTableElement); i++) 
    { 
    if ( (SCSILookupTable[i].key == key || SCSILookupTable[i].key == 0xff) 
     && SCSILookupTable[i].asc == asc 
     && SCSILookupTable[i].ascq == ascq) 
    { 
     return SCSILookupTable[i].errorcondition; 
    } 
    } 

    return "Unknown error"; 
} 


void main() 
{ 
    printf ("%s\n", SCSIErrortext(0, 0x5d, 0)); 
    printf ("%s\n", SCSIErrortext(0xfe, 0x05, 0)); 
    printf ("%s\n", SCSIErrortext(0x00, 0x05, 0)); 
} 

雖然確實有改善的空間,但它不能簡單一些。

+0

的不明身份的複雜性,以這是意義關鍵是獨立的ASC/ASCQ號的所以你需要有非常相似的字符串,而不是單獨解決代碼各部分的好幾倍,然後用sprintf的結合起來。 – 2014-11-04 11:58:40

0

你可以看看libscsicmd這是一個圖書館,我慢慢地工作。它包括一個感應緩衝區解析器和KCQ到人類消費的字符串映射。

它可以在http://github.com/baruch/libscsicmd

被發現,雖然回答您的直接問題,檢測關鍵字和ASC/ASCQ都是獨立的,所以我選擇了返回兩個不同的字符串,一個用於探測鍵,另一個用於ASC/ASCQ對中的每一個都是用從T10文本文件自動生成的大型開關語句來解析的。

如果你再想一個字符串用簡單的sprintf或者strcat的結合起來。

+0

謝謝我會看看:)。其實昨天經過一番詳細閱讀中,我做了什麼你做了,並寫了一個小python腳本其中T10純文本文檔轉換爲查找表。也有意義和ASQ/ASCQ分離。我還添加了狀態查找。 – 2014-11-04 12:57:20