मैं एक अनुभवी पायथन डेवलपर हूं और इसकी कई सुविधाएं पसंद करने आया हूं। मैंने वास्तव में कुछ समय के लिए सी # को जाना है लेकिन हाल ही में कुछ और उन्नत कोडिंग में शामिल हो गए हैं।पाइथन के "struct.pack/unpack" के सी # में समतुल्य?
मुझे क्या आश्चर्य है कि अगर सी # में एक बाइट सरणी को "अलग-अलग आकार के आइटमों" में सेट करने का कोई तरीका है।
कल्पना कीजिए कि हम इस राशि:
सी #:
import struct
byteArray = "\xFF\xFF\x00\x00\x00\xFF\x01\x00\x00\x00"
numbers = struct.unpack("<LHL",byteArray)
print numbers[0] # 65535
print numbers[1] # 255
print numbers[2] # 1
newNumbers = [0, 255, 1023]
byteArray = struct.pack("<HHL",newNumbers)
print byteArray # '\x00\x00\xFF\x00\xFF\x03\x00\x00'
मैं सी # में एक ही प्रभाव हासिल करना चाहते हैं, इस तरह कोड की भारी, गंदा मात्रा का सहारा के बिना:
पायथन:
byte[] byteArray = new byte[] { 255, 255, 0, 0, 0, 255, 1, 0, 0, 0 };
byte[] temp;
int[] values = new int[3];
temp = new byte[4];
Array.Copy(byteArray, 0, temp, 0, 4);
values[0] = BitConverter.ToInt32(temp);
temp = new byte[2];
Array.Copy(byteArray, 4, temp, 0, 2);
values[1] = BitConverter.ToInt16(temp);
temp = new byte[4];
Array.Copy(byteArray, 8, temp, 0, 4);
values[2] = BitConverter.ToInt32(temp);
// Now values contains an array of integer values.
// It would be OK to assume a common maximum (e.g. Int64) and just cast up to that,
// but we still have to consider the size of the source bytes.
// Now the other way.
int[] values = new int[] { 0, 255, 1023 };
byteArray = new byte[8];
temp = BitConverter.GetBytes(values[0]);
Array.Copy(temp,2,byteArray,0,2);
temp = BitConverter.GetBytes(values[1]);
Array.Copy(temp,2,byteArray,2,2);
temp = BitConverter.GetBytes(values[2]);
Array.Copy(temp,0,byteArray,4,4);
जाहिर है मैं सी # कोड बहुत है विशिष्ट और किसी भी तरह से वास्तव में पुन: प्रयोज्य नहीं है।
सलाह?
मैं विभिन्न तकनीकों के प्रदर्शन के बारे में भी उत्सुक हूं। – gbronner