मैं सी में ++ निम्नलिखित पायथन कोड का अनुवाद करने में कोशिश कर रहा हूँ:अनपैक हेक्स एन्कोड तैरता
import struct
import binascii
inputstring = ("0000003F" "0000803F" "AD10753F" "00000080")
num_vals = 4
for i in range(num_vals):
rawhex = inputstring[i*8:(i*8)+8]
# <f for little endian float
val = struct.unpack("<f", binascii.unhexlify(rawhex))[0]
print val
# Output:
# 0.5
# 1.0
# 0.957285702229
# -0.0
तो यह हेक्स एन्कोड स्ट्रिंग के 32-बिट के लायक पढ़ता है, इसके साथ एक बाइट सरणी में बदल जाता है unhexlify
विधि, और इसे थोड़ा-अंतराल फ्लोट मान के रूप में व्याख्या करता है।
लगभग काम करता है के बाद, लेकिन कोड तरह का भद्दा है (और पिछले 00000080
गलत तरीके से पार्स करता है):
#include <sstream>
#include <iostream>
int main()
{
// The hex-encoded string, and number of values are loaded from a file.
// The num_vals might be wrong, so some basic error checking is needed.
std::string inputstring = "0000003F" "0000803F" "AD10753F" "00000080";
int num_vals = 4;
std::istringstream ss(inputstring);
for(unsigned int i = 0; i < num_vals; ++i)
{
char rawhex[8];
// The ifdef is wrong. It is not the way to detect endianness (it's
// always defined)
#ifdef BIG_ENDIAN
rawhex[6] = ss.get();
rawhex[7] = ss.get();
rawhex[4] = ss.get();
rawhex[5] = ss.get();
rawhex[2] = ss.get();
rawhex[3] = ss.get();
rawhex[0] = ss.get();
rawhex[1] = ss.get();
#else
rawhex[0] = ss.get();
rawhex[1] = ss.get();
rawhex[2] = ss.get();
rawhex[3] = ss.get();
rawhex[4] = ss.get();
rawhex[5] = ss.get();
rawhex[6] = ss.get();
rawhex[7] = ss.get();
#endif
if(ss.good())
{
std::stringstream convert;
convert << std::hex << rawhex;
int32_t val;
convert >> val;
std::cerr << (*(float*)(&val)) << "\n";
}
else
{
std::ostringstream os;
os << "Not enough values in LUT data. Found " << i;
os << ". Expected " << num_vals;
std::cerr << os.str() << std::endl;
throw std::exception();
}
}
}
(ओएस पर संकलित X 10.7/जीसीसी-4.2.1, एक सरल g++ blah.cpp
के साथ)
विशेष रूप से, मैं BIG_ENDIAN
मैक्रो सामान से छुटकारा पाना चाहता हूं, क्योंकि मुझे यकीन है कि ऐसा करने के लिए एक अच्छा तरीका है, this post चर्चा करता है।
कुछ अन्य यादृच्छिक विवरण - मैं बूस्ट का उपयोग नहीं कर सकता (परियोजना के लिए बहुत बड़ी निर्भरता)। स्ट्रिंग आम तौर पर 1536 98304 के बीच (8 * 3) और नाव मूल्यों (32 * 3), अधिक से अधिक 786432 (64 * 3) में शामिल होंगे
(EDIT2: एक और मूल्य वर्धित, 00000080
== -0.0
)
मुझे लगता है कि आप का मतलब (ग - 'ए') (अहस्ताक्षरित
uint32_t
ठीक होने की संभावना भी काम करेगा साथ अमरदीप का जवाब) + 10; यह मानते हुए कि यह केवल अपरकेस ए –होगा, इसके अलावा, इसे अंक-दर-अंक स्वयं करने का लाभ यह है कि आप एंडियन-नेस –
@OrgnlDave के आधार पर बाएं से दाएं या दाएं से बाएं लूप कर सकते हैं - यही कारण है कि 'tolower' वहाँ है। हां एंडियन-नेस पर, हालांकि यह थोड़ा ट्रिकियर बन जाता है (एक बाइट अंकों के लिए स्वैप नहीं होता है) –