C++

2016-03-19 16 views
3

için Java'yı int64'e kadar uzun bir süreye dönüştürün Java istemcisinden C++ sunucusundaki soket bağlantısı aracılığıyla bazı sayısal verileri alıyorum. 4 bayt int tipi veri aldığımda, ntohl() işlevini kullanmak veya C++ int türüne dönüştürmek için bit sırasını ters çevirmek gerekir. Ancak, uzun veri türünü Java'dan dönüştürmeye çalışırken sorun yaşıyorum. Ne denedim olursa olsun, doğru değeri elde edemedim. Ben de LONG64, ULONG64 ve int64_t kullandım ve bunların hiçbiri işe yaramadı. Yaptığım C++ tarafında, Java uzun s = 1 göndermek ÖrneğinC++

:

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 

size = ntohl(size) 

Sonra boyut 0 olacak ben yoksa ne olursa olsun orijinal uzun değeri Java'da! Ben ntohl() dönüşüm sonra size = s = 1

için 72057594037927936 yapmazsanız

Ben pek bu konu hakkında herhangi bir yararlı bilgiler bulduk ve herhangi bir öneri takdir ediyorum.

+0

Netlik için, mimaride * 64 bit * 4 bayt int türünde bir veri var? Son kontrol ettim, ** 4 ** bayt neredeyse her zaman 4 oktet = ** 32 ** bit. Her zaman (a) bunları bir int8_t ar [n] 'da okuyabileceğinizi ve aslında bayt sayısını okuyabildiğini ve sırayla nerede olduklarını doğrulayabileceğinizi biliyorsunuz. 'Recv' nin dönüş sonucunun doğrulanması da zarar görmemiştir. – WhozCraig

+0

Java, C ve C++ 'dan farklı olarak, endianiteyi umursamıyor; büyük bir endian olacak. Bu senin sorununun kaynağı değil mi? – fge

+0

Önerileriniz için teşekkür ederiz. Rob'un cevabında söylediği gibi, problem ntohl() işlevinin kendisi üzerinde, 32 bit veri üzerinde çalışıyor. –

cevap

2

Değeri 72057594037927936, Hex'te 0x0100000000000000 değeridir. Tahmin edebileceğiniz gibi, bu sadece geriye doğru bayt siparişi, 1 geri yerine ön sırada.

ntohl() 32-bittir, bu yüzden size bu sıfırı vererek, bu ilk dört bayttan (ilk 8 altı haneli) dışarı atmaktadır. Bunun yerine htonll kullanabilirsiniz, ama bu doğru değil. En iyi şey, baytların sırasını kendiniz tersine çevirmektir.

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 
char *start = (char *)&size, *end = start + sizeof(size); 
std::reverse(start, end); 

bayt tersine yolları bir ton ve genel olarak küçük/büyük endian sorunlarla başa yollarla bir ton vardır.

+0

Açık ve basit. Çok teşekkür ederim efendim! –