2015-01-16 31 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转储。 –

回答

相关问题