2015-01-16 33 views
-2

我敢肯定,這是不小/大端相關,因爲我的機器是小端(mac)和代碼會無論如何處理它...使用NSOutputStream,我看到00 00 0a 00而不是0 00 00 00

我正在寫一個uint32_t到NSOutputStream。即設置它的代碼是這樣的:

uint32_t transaction_id = 0x000A; 

使用Wireshark的,我認爲這是作爲字節序列00 00 0A 00傳輸。 正確(設備所期望的)是0A 00 00 00

我在做什麼錯? 謝謝!

編輯:我陷入了麻煩,因爲不包括代碼。這裏是。但願我是 「的話題,現在」

struct _PTPParams { 
/* data layer byteorder */ 
uint8_t byteorder; 

(snip!)  
/* ptp transaction ID */ 
uint32_t transaction_id; 

...

params->transaction_id = htod32(0x000A); // start the transaction ID at non-zero 
ret = ptp_getdeviceinfo(params,&params->deviceinfo); 

...

uint16_t 
ptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo) 
{ 
uint16_t ret; 
PTPContainer ptp; 
char* di=NULL; 

ptp_debug(params,"PTP: Obtaining DeviceInfo"); 

PTP_CNT_INIT(ptp); 
ptp.Code=PTP_OC_GetDeviceInfo; 
ptp.Nparam=0; 
ret=ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &di); 

...

static uint16_t 
ptp_transaction (PTPParams* params, PTPContainer* ptp, 
      uint16_t flags, unsigned int sendlen, char** data) 
{ 
if ((params==NULL) || (ptp==NULL)) 
    return PTP_ERROR_BADPARAM; 

ptp->Transaction_ID=params->transaction_id++; 
ptp->SessionID=params->session_id; 
/* send request */ 
CHECK_PTP_RC(params->sendreq_func (params, ptp)); 

...

static uint16_t 
ptpip_sendreq (PTPParams* params, PTPContainer* req) 
{ 
static uint16_t ret; 
static PTP_IP_Packet_COMMAND_REQ ptpipreq; 

PTP_CNT_INIT(ptpipreq); 
/* build ptp/ip container */ 

int32_t packetSize = PTP_IP_PacketLength_COMMAND_REQ- 
(sizeof(uint32_t)*(5-req->Nparam)); 

ptpipreq.ptpIPPacketLength=htod32(packetSize); 
ptpipreq.ptpIPType=htod32(PTP_IP_TYPE_COMMAND_REQ); 
ptpipreq.ptpIPdataphase=htod32(PTP_IP_CONST_DATAPHASE); 
ptpipreq.code=htod16(req->Code); 
ptpipreq.trans_id=htod32(req->Transaction_ID); 
/* send it */ 
ret=params->write_func((unsigned char *)&ptpipreq, 
         packetSize, 
         params->data); 

...

static short 
ptpip_write_func (unsigned char *bytes, unsigned int size, void *data) 
{  
PTPCamera* cam = (__bridge PTPCamera*)data; 

unsigned int bytesToWrite = size; 

while(bytesToWrite > 0) { 

    unsigned chunkSize = (bytesToWrite > PTP_IP_MAX_PACKET_LEN)?PTP_IP_MAX_PACKET_LEN:bytesToWrite; 
    unsigned char chunk[chunkSize]; 
    memcpy(chunk, bytes+(size-bytesToWrite), chunkSize); 

    // cam.outStream is an NSOutputStream, with NSStreamStatus = open 
    int result = [cam.outStream write:chunk maxLength:chunkSize]; 

現在分組被髮送,和Wireshark其顯示爲(僅示出PTP部分):

0000 12 00 00 00 06 00 00 00 01 00 00 00 01 10 00 00 ................ 
0010 0a 00           .. 

...那些最後4個字節是問題(transaction_id) - 應該是0A 00 00 00

編輯2:請注意,htod16()和htod32()有效解決爲無(因爲它們是在小端系統上編譯的),因此您可以忽略它們...

編輯3:發現問題它不是端到端的,但不知道如何解決它。如果我設置TRANSACTION_ID到0xFAFBFCFD,我看到這個...

one two

...什麼是錯的是,有ptp.code(01 10)之間的2點額外的00和TRANSACTION_ID的開始( FD)。 ptp.code是一個uint16_t(sizeof報告2),那麼爲什麼有6個00s而不是4個?

+4

你需要顯示更多的代碼,你如何將它寫入輸出流? –

+1

你很「確定」,典型的排卵問題/誤解症狀與排卵期無關......究竟如何? –

+1

您需要向我們展示序列化數據的代碼,並向我們展示數據包的完整wireshark轉儲。 –

回答

相關問題