1

Linuxで.soファイルを作成しているので、それらをPythonスクリプトにインポートして使用を開始できます。それらを使用できるように、PythonからC ++レイヤーにデータを渡す必要があります。多くの投稿を参照しているにもかかわらず、値を抽出できません。以下に参照コードを示します。u8 => 符号なし文字

#include "cp2p_layer.h"

#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(cp2p_hal)
{
    class_<SCSICommandsB>("SCSICommandsB")
        .def("Write10", &SCSICommandsB::Write10)
    ;
}

次のコードは、cp2p_layer.cpp からのものです。リストの長さを取得できますが、データは常に黒です

u16 SCSICommandsB::Write10 (u8 lun, u8  config, u32 LBA, u16 transferLen, u8 control, u8 groupNo,  boost::python::list pythonList)
{
    u16 listLen;
    u8*  pDataBuf = new u8[transferLen];

    listLen = boost::python::len(pythonList);
    if( listLen != transferLen)
    {
        cout<<"\nwarning: The write10 cdb has transfer length "<<transferLen<<"that doesnt match with data buffer size "<<listLen<<"\n";
    }

    for(int i = 0; i < listLen; i++)
    {
        pDataBuf[i] = boost::python::extract<u8>( (pythonList)[i] );
        cout<<boost::python::extract<u8>( (pythonList)[i] )<<"-";
        //cout<<pDataBuf[i]<<".";
    }
    cout<<"\n";
    cout<<"info: inside write10 boost len:"<<listLen<<"\n";

    return oScsi.Write10 (lun, config, LBA, transferLen, control, groupNo,  pDataBuf);
}

Pythonスクリプトを次のように実行すると

#!/usr/bin/python
import cp2p_hal

scsiCmds = cp2p_hal.SCSICommandsB()
plist = [0,1,2,3,4,5,6,7,8,9]
print len(plist)
scsiCmds.Write10(0,0,0,10,0,0,plist) 

出力は次のようになります

10
--------        -
info: inside write10 boost len:10

どんな助けでも大歓迎です。また、読み取りコマンドを実行した後に C++ レイヤーからデータを読み取る方法についても質問があります。これが完了したら、新しい投稿を作成します。前もって感謝します。

4

1 に答える 1

2

問題は、値の印刷にのみあります。u8C++の Aはunsigned charでありcout、対応する ASCII 文字を出力します。あなたの文字 (0-9) は、たまたまタブである ASCII 9 を除いて、印刷できません。これは、出力の最後のハイフンの前のスペースを説明しています。

修正方法は?出力する前に int にキャストします。

cout << static_cast<int>(boost::python::extract<u8>(pythonList[i])) << "-";
于 2013-10-21T19:18:14.153 に答える