2014-11-03 89 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