我很确定这不是小/大端相关的,因为我的机器是小端(mac)并且代码无论如何都要处理它......
我正在向NSOutputStream
写一个uint32_t。设置它的代码是这样的:
uint32_t transaction_id = 0x000A;
使用wireshark,我发现它是作为字节序列00 00 0A 00
传输的。
正确(设备期望的)是0A 00 00 00
我做错了什么? 谢谢!
编辑:我因为不包括代码而陷入困境。这里是。希望我现在能够主题#34;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)和transaction_id(FD)的开始之间有2个额外的00。 ptp.code是一个uint16_t(sizeof报告2),为什么有6个而不是4个?!
答案 0 :(得分:0)