使用NSOutputStream,我看到00 00 0a 00而不是0 00 00 00

时间:2015-01-16 22:41:24

标签: ios c

我很确定这不是小/大端相关的,因为我的机器是小端(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,&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)和transaction_id(FD)的开始之间有2个额外的00。 ptp.code是一个uint16_t(sizeof报告2),为什么有6个而不是4个?!

1 个答案:

答案 0 :(得分:0)

解决了它。它是内存对齐 - 来自线程Struct Byte Alignment Issue XCode 4.3,我使用

#pragma pack(push,2)

......现在它完美无缺。