2008-12-21 17 views
5

मेरे पास इनपुट के रूप में बाइट सरणी है। मैं उस सरणी को स्ट्रिंग में कनवर्ट करना चाहता हूं जिसमें सरणी मानों का हेक्साडेसिमल प्रतिनिधित्व शामिल है। यह एफ # कोड है:एफ # बाइट [] -> हेक्स -> स्ट्रिंग रूपांतरण

let ByteToHex bytes = 
    bytes 
    |> Array.map (fun (x : byte) -> String.Format("{0:X2}", x)) 

let ConcatArray stringArray = String.Join(null, (ByteToHex stringArray)) 

इससे मुझे परिणाम मिलते हैं, लेकिन मैं इसे और अधिक कॉम्पैक्ट बनाना चाहता हूं ताकि मेरे पास केवल एक ही कार्य हो। मुझे फ़ंक्शन नहीं मिल सका जो बाइटटोएक्स के के अंत में प्रत्येक बाइट के स्ट्रिंग प्रस्तुति को जोड़ देगा।
मैंने ऐरे.कोनकैट, concat_map की कोशिश की, मैंने सूचियों के साथ प्रयास किया, लेकिन सबसे अच्छा मैं प्राप्त कर सकता था सरणी या तारों की सूची।

सवाल:

  1. क्या सरल, सबसे खूबसूरत ऐसा करने के लिए तरीका क्या होगा?
  2. क्या F # में स्ट्रिंग स्वरूपण निर्माण है ताकि मैं सिस्टम असेंबली से स्ट्रिंग.फॉर्मैट को प्रतिस्थापित कर सकूं?

उदाहरण इनपुट: [0x24uy; 0xA1uy; 0x00uy; 0x1Cuy |] स्ट्रिंग "24A1001C"

उत्तर

5

अपने उदाहरण के साथ स्वाभाविक कुछ भी गलत नहीं है। यदि आप इसे एक अभिव्यक्ति पर ले जाना चाहते हैं तो String.contcat विधि का उपयोग करें।

let ByteToHex bytes = 
    bytes 
    |> Array.map (fun (x : byte) -> System.String.Format("{0:X2}", x)) 
    |> String.concat System.String.Empty 

हुड के तहत, स्ट्रिंग.कोनकैट केवल स्ट्रिंग में शामिल होगा। जॉइन। आपके कोड को धीरे-धीरे बदलना पड़ सकता है हालांकि आपके नमूने के आधार पर आप सिस्टम आयात करते हैं। यह एफ # स्ट्रिंग और सिस्टम। स्ट्रिंग के बीच एक नाम समाधान संघर्ष बना सकता है।

+0

परफेक्ट सीखने के लिए कर सकता था। मैंने String.Concat के साथ प्रयास किया, लेकिन मैंने "System.String.Empty" तर्क नहीं जोड़ा। – zendar

-1

ईमानदार होने के लिए, यह भयानक नहीं दिखता है (हालांकि मेरे पास बहुत थोड़ा F # अनुभव) होना चाहिए। क्या एफ # पुनरावृत्ति (foreach) करने का एक आसान तरीका प्रदान करता है? यदि यह था सी #, मैं की तरह कुछ का उपयोग कर सकते हैं (जहां raw एक byte[] तर्क है):

 StringBuilder sb = new StringBuilder(); 
     foreach (byte b in raw) { 
      sb.Append(b.ToString("x2")); 
     } 
     return sb.ToString() 

मुझे आश्चर्य है कि कैसे है कि एफ # करने के लिए अनुवाद ...

+0

हेहे, मैं यह एफ # में इस तरह wite सकते हैं, लेकिन लुका Bolognese http://channel9.msdn.com/pdc2008/TL11/ पहले कुछ ही मिनटों में से इस प्रस्तुति की जाँच वहाँ अनिवार्य के बीच अंतर के बारे में विवरण है और घोषणात्मक प्रोग्रामिंग और उदाहरण इटरेटर के बारे में है। – zendar

+0

पर्याप्त मेला। मैं फिर एक बेहतर जवाब के लिए देखता हूँ। मैं कुछ एफ # ;-p –

0

मुझे ठीक लग रहा है। बस एक और इंगित करने के लिए, मेरी राय में, प्रिंटफ मॉड्यूल में बहुत उपयोगी फ़ंक्शन, ksprintf पर एक नज़र डालें। यह आपकी पसंद के एक फ़ंक्शन में एक निर्धारित स्ट्रिंग का परिणाम पास करता है (इस मामले में, पहचान फ़ंक्शन)।

val ksprintf : (string -> 'd) -> StringFormat<'a,'d> -> 'a 
    sprintf, but call the given 'final' function to generate the result. 
1

यहाँ एक और सवाल का जवाब है:

let hashFormat (h : byte[]) = 
    let sb = StringBuilder(h.Length * 2) 
    let rec hashFormat' = function 
    | _ as currIndex when currIndex = h.Length -> sb.ToString() 
    | _ as currIndex -> 
     sb.AppendFormat("{0:X2}", h.[currIndex]) |> ignore 
     hashFormat' (currIndex + 1) 
    hashFormat' 0 

इस एक के ऊपर है कि यह पूंछ पुनरावर्ती है और स्ट्रिंग बिल्डर में अंतरिक्ष की सही मात्रा है कि यह पहले से आवंटित के रूप में परिवर्तित करने के लिए आवश्यक हो जाएगा एक हेक्स-स्ट्रिंग के लिए बाइट सरणी।

संदर्भ के लिए, मैं इसे इस मॉड्यूल में है:

module EncodingUtils 

open System 
open System.Text 
open System.Security.Cryptography 
open Newtonsoft.Json 

let private hmacmd5 = new HMACMD5() 
let private encoding = System.Text.Encoding.UTF8 
let private enc (str : string) = encoding.GetBytes str 
let private json o = JsonConvert.SerializeObject o 
let md5 a = a |> (json >> enc >> hmacmd5.ComputeHash >> hashFormat) 

मतलब मैं md5 किसी भी वस्तु से गुजरती हैं और इसके बारे में एक JSON हैश वापस मिल सकता है।

2

यदि आप एक चरण में बदलना और जमा करना चाहते हैं, तो fold आपका उत्तर है। sprintf एफ # स्ट्रिंग प्रारूप समारोह है।

let ByteToHex = Array.fold (fun state x-> state + sprintf "%02X" x) "" 
+1

यह हल करने के लिए यह सबसे अच्छा f # -py तरीका है – albertjan

संबंधित मुद्दे