我敢肯定,這是不小/大端相關,因爲我的機器是小端(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轉儲。 –