рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдмрд╛рдЗрдирд░реАрдХреЛрдб рдореЗрдВ рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪрд▓реЛ C # рд▓реЗ рд▓реЛред
(рд╣рд╛рдВ, рд╣рдо рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реИ? рдпрджрд┐ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЧреИрд░-рдорд╛рдирдХ рд▓реЛрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)
Bencodeред рдЬреИрд╕рд╛ рд╡рд╣ рд╣реИ
So. рдЖрдЗрдП рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдмреЗрдирдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:
рдЗрд╕рдореЗрдВ 4 рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)
- рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ
- рдкреВрд░реНрдгрд╛рдВрдХ
- рд╕реВрдЪреА
- рд╢рдмреНрджрдХреЛрд╢
рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ, Bencode ASCII рд╡рд░реНрдгреЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕рдорд╛рд╣рд┐рдд рд╣реИ?
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░:
1) рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ - рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ (рд╕рдВрдЦреНрдпрд╛) рд╣реЛ, рдлрд┐рд░ рдХреЛрд▓рди рд╕рд╛рдЗрди (":") рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: 5: рд╣реИрд▓реЛ рдпрд╛ 12: рд╣реИрд▓реЛ, рд╣рдмрд▓!
2) рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ - рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ: рдкреНрд░рддреАрдХ "рдореИрдВ" (рдкреВрд░реНрдгрд╛рдВрдХ), рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддреАрдХ "рдИ" (рдЕрдВрдд)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: i9e рдпрд╛ i199eред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рдХрд╛рд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ "рд╕рдорд░реНрдерди" рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП i-9e (-9) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ
рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдорд┐рд▓рдХрд░):
1) рд╕реВрдЪреА - (рдЙрд░реНрдл рдПрдХ рд╕рд░рдгреА) - рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдмреЗрдирдХреЛрдб рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдкреНрд░рддреАрдХ "рдПрд▓" (рд╕реВрдЪреА), рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг, рдкреНрд░рддреАрдХ "рдИ" рд╣реИред рдЙрджрд╛рд╣рд░рдг: l1: I3: You2: Wee ["I", "You", "We"]
2) рд╢рдмреНрджрдХреЛрд╢ - (рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА) - рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдХреЛ "рдХреБрдВрдЬреА" рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рд▓реЗрдХреНрд╕реЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдкреНрд░рддреАрдХ "рдбреА" (рд╢рдмреНрджрдХреЛрд╢), рдХреБрдВрдЬреА-рдореВрд▓реНрдп рддрддреНрд╡, рдкреНрд░рддреАрдХ "рдИ"ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП d5: Alpha4: Beta10: filesCounti9ee ["рдЕрд▓реНрдлрд╛" - "рдмреАрдЯрд╛", "filesCount" - 9]
BEncode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдмреЗрдирдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдорд╛рд░реА рд╕рднреА рдкрд╕рдВрджреАрджрд╛ .torrent рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА (рд╢рдмреНрджрдХреЛрд╢) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВред
рд╣рдо рдЙрдкрдХрд░рдг .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗред
рд╣рдо рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, "рдЕрд▓рдорд╛рд░рд┐рдпреЛрдВ рдкрд░ рдмрд╛рд╣рд░ рдмрд┐рдЫрд╛рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд░рд▓ рддрддреНрд╡реЛрдВ (рдмреАрдЗрдЯреЗрдо) рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ (рдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╣рдо рдПрдХ рд╕реВрдЪреА рд╡рд░реНрдЧ (BList) рдФрд░ рдлрд┐рд░ рдПрдХ рд╡рд░реНрдЧ - рдПрдХ рд╢рдмреНрджрдХреЛрд╢ (BDEDIA)) рдмрдирд╛рдПрдВрдЧреЗред
рдЪреВрдВрдХрд┐ рдмреАрдПрдирдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рддрддреНрд╡ рдПрдХ рджреВрд╕рд░реЗ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рд╡рд░реНрдЧ (рдмреАрд▓реАрдореЗрдВрдЯ) рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рддрддреНрд╡реЛрдВ рдФрд░ рд╕реВрдЪреА рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ, рд╢рдмреНрджрдХреЛрд╢ рдФрд░ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рд╕рдордЧреНрд░ рд╡рд░реНрдЧ рдорд┐рд▓рддрд╛ рд╣реИред
рдФрд░ рдЕрдВрддрд┐рдо 5 рд╡реАрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреАред
рд░реЗрдЦрд╛рдВрдХрди, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдлрд╛рдЗрд▓ рдПрдирдХреЛрдбрд┐рдВрдЧ рдкрдврд╝реЗрдВ
BItem рд╡рд░реНрдЧ рдореЗрдВ рд╣реИ
- рдкрдВрдХреНрддрд┐
- рд╕рдВрдЦреНрдпрд╛
- рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдзреНрд╡рдЬ
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рдзрд┐ (рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ ToString ())
/// <summary> /// integer value /// start - 'i' /// end - 'e' /// Example - i145e => 145 /// string value /// start - length /// end - /// Example 5:hello => "hello" /// </summary> public class BItem { protected string strValue = ""; protected int intValue = 0; protected bool IsInt = true; public bool isInt { get { return IsInt; } } public BItem(string A) { strValue = A; IsInt = false; } public BItem(int A) { IsInt = true; intValue = A; } public string ToString() { if (IsInt) return intValue.ToString(); return strValue; } }
BList рд╡рд░реНрдЧ рдореЗрдВ рд╣реИ
- рддрддреНрд╡реЛрдВ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рд╕реВрдЪреА (BElement)
- рдЕрдиреБрдХреНрд░рдордг
- рд╕рдВрдкрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
- рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ (рдЬреЛрдбрд╝реЗрдВ)
/// <summary> /// List /// start - 'l' /// end - 'e' /// Example - l5:helloi145e => ("hello",145) /// </summary> public class BList { List<BElement> Items = null; public BList() { Items = new List<BElement>(); } public BElement this[int index] { get { if (Items.Count > index) { return Items[index]; } return new BElement(); } set { if (Items.Count > index) { Items[index] = value; } else { throw new Exception(" . !"); } } } public int Count { get { return Items.Count; } } /// <summary> /// /// </summary> public void Add(BElement inf) { Items.Add(inf); } }
BDEDIA рд╡рд░реНрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ
- рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБ (рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП)
- рд╕рдВрдкрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
- рдЕрдиреБрдХреНрд░рдордг
- рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ (рдЬреЛрдбрд╝реЗрдВ)
/// <summary> /// Dictionary /// start - 'd' /// end - 'e' /// Example - d2:hi7:goodbyee => ("hi" => "goodbye") /// </summary> public class BDictionary { protected List<BElement> FirstItem = null; protected List<BElement> SecondItem = null; public BDictionary() { FirstItem = new List<BElement>(); SecondItem = new List<BElement>(); } public int Count{ get { return FirstItem.Count; } } /// <summary> /// /// </summary> /// <param name="index"></param> /// <returns></returns> public BElement[] this[int index] { get{ if (FirstItem.Count > index) { BElement[] Items = new BElement[2]; Items[0] = FirstItem[index]; Items[1] = SecondItem[index]; return Items; } return new BElement[2]; } set{ if (FirstItem.Count > index) { FirstItem[index] = value[0]; SecondItem[index] = value[1]; } else { //FirstItem.Add(value[0]); // SecondItem.Add(value[1]); - , .. !!!!! throw new Exception(" . "); } } } /// <summary> /// /// </summary> /// <param name="First"></param> /// <param name="Second"></param> public void Add(BElement First, BElement Second) { FirstItem.Add(First); SecondItem.Add(Second); } }
рдЕрдм рд╣рдо "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ" рд╡рд░реНрдЧ рдмреАрдИрд▓рдореЗрдВрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдмреАрдЗрд▓рдореЗрдВрдЯ рд╡рд░реНрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
- BItem рдкреНрд░рдХрд╛рд░ рдЪрд░ - string \ number рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- BList рдкреНрд░рдХрд╛рд░ рдЪрд░ - рд╕реВрдЪреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ BDEDIA рдХрд╛ рдПрдХ рдЪрд░ - рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐
- рд╕реВрдЪреА рдкрдврд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐
- рд╢рдмреНрджрдХреЛрд╢ рдкрдврд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐
- рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ (рд╡рд┐рдзрд┐)
/// <summary> /// "" /// </summary> public class BElement { public BItem STDItem = null; public BList LSTItem = null; public BDictionary DICItem = null; /// <summary> /// string\integer /// </summary> /// <param name="Reader"> </param> /// <param name="CurrentCode"> </param> public void AddToBItem(StreamReader Reader, char CurrentCode) { char C; if (CurrentCode == 'i') {// string Value= ""; C = (char)Reader.Read(); while (C != 'e') {// Value += C; C = (char)Reader.Read(); } try { int Res = Int32.Parse(Value); STDItem = new BItem(Res); } catch (Exception ex) { // throw . null' STDItem = null; } return; } int length = (int)CurrentCode - (int)'0'; C = (char)Reader.Read(); while (C != ':' && (C>='0' && C<='9')) { length = length * 10 + (int)C - (int)'0'; C = (char)Reader.Read(); } if (C!= ':') {// ( , , throw new Exception(" "); // throw ... =) STDItem = null; return; } string value = ""; for (int CurrentCount = 0; CurrentCount < length; CurrentCount++) { value += (char)Reader.Read(); } STDItem = new BItem(value); } /// <summary> /// . , l /// </summary> /// <param name="Reader"> </param> public void AddToBList(StreamReader Reader) { LSTItem = new BList(); BElement Temp = GetNewBElement(Reader); while (Temp != null) { LSTItem.Add(Temp); Temp = GetNewBElement(Reader); } if (LSTItem.Count == 0) LSTItem = null;// - . } /// <summary> /// /// </summary> /// <param name="Reader"> </param> public void AddToBDic(StreamReader Reader) { DICItem = new BDictionary(); BElement FirstTemp = GetNewBElement(Reader); BElement SecondTemp = GetNewBElement(Reader); while (FirstTemp != null || SecondTemp != null) { DICItem.Add(FirstTemp, SecondTemp); FirstTemp = GetNewBElement(Reader); SecondTemp = GetNewBElement(Reader); } if (DICItem.Count == 0) DICItem = null;// } /// <summary> /// . /// </summary> /// <param name="Reader"> </param> /// <returns> </returns> public static BElement GetNewBElement(StreamReader Reader) { char C = (char)Reader.Read(); switch (C) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'i': {// BElement STDElement = new BElement(); STDElement.AddToBItem(Reader, C); return STDElement; } case 'l': {// BElement LSTElement = new BElement(); LSTElement.AddToBList(Reader); return LSTElement; } case 'd': {// BElement DICElement = new BElement(); DICElement.AddToBDic(Reader); return DICElement; } default://("e") return null; } } }
рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ, рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ "рджрд┐рд▓" - рдлрд╛рдЗрд▓рдмреИрдХрдирдХреЛрдбрд┐рдВрдЧ
рдпрд╣ BEncode \ XML рд▓реЗрдЦрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрдврд╝рдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
- BElement рдХреА рд╕реВрдЪреА (рдХреНрдпреЛрдВрдХрд┐ .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдмрд╕ BElement рдХрд╛ рдПрдХ рдЪрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
- рдЕрдиреБрдХреНрд░рдордг (рд╕реВрдЪреА рд╡рд┐рдХрд▓реНрдк)
- рдлрд╝рд╛рдЗрд▓ рдкрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
public class FileBEncoding { List<BElement> BenItems;// , BElement BenItem BElement this[int index] { get { if (BenItems.Count > index) return BenItems[index]; return null; } set { if (BenItems.Count > index) { BenItems[index] = value; } else throw new Exception(" . "); } } public FileBEncoding(string Path) { if (!File.Exists(Path)) return; BenItems = new List<BElement>(); StreamReader Reader = new StreamReader(Path, Encoding.ASCII); while (!Reader.EndOfStream) { BElement temp = BElement.GetNewBElement(Reader); if (temp != null) BenItems.Add(temp); } Reader.Close(); }
рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реЗрдЦрд╛ рдЖрдЙрдЯрдкреБрдЯ
рдпрджрд┐ рдЖрдк xml рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореИрдВ рдПрдХ "рд╕рдВрд░рдЪрд┐рдд" рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ \ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
C # рдХреА рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд▓реА рдЧрдИ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ ToString () рд╡рд┐рдзрд┐ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
private string BElementToSTR(BElement CurrentElement, int TabCount, bool Ignore = true) { // if (CurrentElement == null) return "";// , . string Result = "";// if (Ignore)// PasteTab(ref Result, TabCount); if (CurrentElement.STDItem != null) { Result += CurrentElement.STDItem.ToString(); return Result; } if (CurrentElement.LSTItem != null) {// Result += "List{\n"; for (int i = 0; i < CurrentElement.LSTItem.Count; i++) Result += BElementToSTR(CurrentElement.LSTItem[i], TabCount + 1) + '\n'; PasteTab(ref Result, TabCount); Result += "}List\n"; return Result; } if (CurrentElement.DICItem != null) {// Result += "Dict{\n"; for (int i = 0; i < CurrentElement.DICItem.Count; i++) { Result += BElementToSTR(CurrentElement.DICItem[i][0], TabCount + 1) +" => "+ BElementToSTR(CurrentElement.DICItem[i][1], TabCount+1,false) + '\n'; } PasteTab(ref Result, TabCount); Result += "}Dict\n"; return Result; } return "";// null, } private string PasteTab(ref string STR,int count) {// for (int i = 0; i < count; i++) STR += '\t'; return STR; } public string ToString() { string Result = ""; for (int i = 0; i < BenItems.Count; i++) { Result += BElementToSTR(BenItems[i], 0) + "\n\n"; } return Result; }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд 2 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдПрдХ рдПрдХрд▓ BElement рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ (рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИ), рджреВрд╕рд░рд╛ - рдЗрдВрдбреЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ, рдореИрдВ XML рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЗрд╕ рднрд╛рд╖рд╛ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛-рд╡рд┐рдирд┐рдордп рдХреА рдПрдХрд▓ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред C # (рдпрд╛ рдмрд▓реНрдХрд┐, .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо) рдЙрддреНрдХреГрд╖реНрдЯ XML рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдо System.XML рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдореЗрд░реА рдкрд╕рдВрдж XmlWriter рд╡рд░реНрдЧ рдкрд░ рдЧрд┐рд░ рдЧрдИред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ "рдЦрд░реЛрдВрдЪ рд╕реЗред" рдФрд░ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдЗрд╕рдХреА рдЙрдЪреНрдЪ рдЧрддрд┐ рд╣реИред
рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд╢реВрдиреНрдп ToXMLFile (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрде) рдФрд░ рд╢реВрдиреНрдп BElementToXML (BElement рдХрд░рдВрдЯ, XmlWriter рд▓реЗрдЦрдХ, рдЗрдВрдЯ рдСрд░реНрдбрд░ = 0)
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЖрд╡рд╢реНрдпрдХ XmlWriter рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧреА рдФрд░ рд╕реВрдЪреА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП BElementToXML рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧреАред
рджреВрд╕рд░реА рд╡рд┐рдзрд┐ "рдЕрдиреБрдкрдЪрд╛рд░рд┐рдд" BElement рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИ (рдпрджрд┐ рдпрд╣ рдПрдХ рд╕реВрдЪреА \ рдбрд┐рдХреНрд╢рдирд░реА рд╣реИ) рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
private void BElementToXML(BElement Current, XmlWriter Writer, int order = 0) { if (Current == null) return;// if (Current.STDItem != null) {// Writer.WriteAttributeString("STDType"+'_'+order.ToString(), Current.STDItem.ToString()); return; } if (Current.LSTItem != null) {// Writer.WriteStartElement("List");// <List> for (int i = 0; i < Current.LSTItem.Count; i++) BElementToXML(Current.LSTItem[i],Writer,order);// Writer.WriteEndElement();// </List> return; } if (Current.DICItem != null) {// ( ) Writer.WriteStartElement("Dictionary"); for (int i = 0; i < Current.DICItem.Count; i++) { Writer.WriteStartElement("Dictionary_Items"); BElementToXML(Current.DICItem[i][0], Writer,order); BElementToXML(Current.DICItem[i][1], Writer,order+1); Writer.WriteEndElement(); } Writer.WriteEndElement(); return; } return; } public void ToXMLFile(string path) { using (XmlTextWriter XMLwr = new XmlTextWriter(path, System.Text.Encoding.Unicode)) { XMLwr.Formatting = Formatting.Indented; XMLwr.WriteStartElement("Bencode_to_XML"); foreach (BElement X in BenItems) { XMLwr.WriteStartElement("BenItem"); BElementToXML(X, XMLwr); XMLwr.WriteEndElement(); } XMLwr.WriteEndElement(); } }
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ BEncode рдлрд╛рдЗрд▓ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ:
(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ ubuntu рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред SHA рдиреЗ рдЪрд╛рдмрд┐рдпрд╛рдБ рд╣рдЯрд╛ рджреАрдВред)
рдХрдВрд╕реЛрд▓: (ToString)

рдПрдХреНрд╕реЗрд▓: (xml)

рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдЫреЛрдЯреЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╕рдмрдХ рд╕реАрдЦрд╛: рдмреАрдПрдирдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ, рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
рдФрд░ BEncode рд╕реЗ XML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, BEncode рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрд╛рджрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣рд╛рдБ рдХреЛрдб рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИрд╕рд╛рд╣рд┐рддреНрдп
- рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ - рдмреЗрдирдХреЛрдб рдлрд╝рд╛рдЗрд▓реЗрдВ
- рдмреЗрди рд╡рд╛рдЯрд╕рди - рд╕реА # 4.0