2014-10-28 19 views
0

我有一個與USB交互的程序,我想知道下面的寫命令告訴我什麼。我明白writev iovec結構由數據數組指針組成,後跟長度,但數據數組中的"@\10\335 \320\2w\4\240K\252\0\7"表示什麼?我特別想知道@符號,2w和240K是什麼意思,因爲它們不是我所期望的那樣的十六進制數據值。Strace with writev()函數在Linux中,'@','2w'和'240K'在數據中代表什麼?

我在Linux上運行,這裏是writev可以獲得行:

writev(6, [{"@\10\335 \320\2w\4\240K\252\0\7", 13}, {"\0\0\0\4\0\0\0\4", 8}], 2) = 21 
+1

「@」是「@」。 「2w」是兩個字節「\ 2w」的一部分。 「240K」是兩個字節「\ 240K」的一部分。 – 2014-10-28 18:14:19

+0

@ IgnacioVazquez-Abrams,所以它只是一個直接的ASCII轉換? – ryeager 2014-10-28 18:19:58

+0

對於可打印的ASCII部分,當然。 – 2014-10-28 18:21:53

回答

3

man page of writev

ssize_t readv(int fd, const struct iovec *iov, int iovcnt); 

也就是說,第二個參數是大小的數值數組第三個參數(您的案例中的2struct iovec類型的元素。

strace打印那些它八進制恰好逸出的不可打印字符顯示,但所有其它的,因爲它們可以被打印。因此,@只是對應於@的字節,K是對應於K等的字節。


回答您的評論的問題,再看看man page顯示

struct iovec { 
    void *iov_base; /* Starting address */ 
    size_t iov_len;  /* Number of bytes to transfer */ 
}; 

這意味着{"@\10\335 \320\2w\4\240K\252\0\7", 13}是應該被理解成iov_len = 13iov_base是包含打印爲@\10\335 \320\2w\4\240K\252\0\7字節的存儲區。火起來gdb如果你想看到的二進制值:

[[email protected] 1]$ gdb -q 
(gdb) p/x "@\10\335 \320\2w\4\240K\252\0\7" 
$1 = {0x40, 0x8, 0xdd, 0x20, 0xd0, 0x2, 0x77, 0x4, 0xa0, 0x4b, 0xaa, 0x0, 0x7, 0x0} 

其中最後0x0是字符串的空終止,應該被忽略。

+1

真棒@MihaiMaruseac,感謝您的詳細答案,我正在尋找! – ryeager 2014-10-28 18:56:05

相關問題