我敢肯定,这是不小/大端相关,因为我的机器是小端(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,¶ms->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,我看到这个...
...什么是错的是,有ptp.code(01 10)之间的2点额外的00和TRANSACTION_ID的开始( FD)。 ptp.code是一个uint16_t(sizeof报告2),那么为什么有6个00s而不是4个?
你需要显示更多的代码,你如何将它写入输出流? –
你很“确定”,典型的排卵问题/误解症状与排卵期无关......究竟如何? –
您需要向我们展示序列化数据的代码,并向我们展示数据包的完整wireshark转储。 –