You can get this and more information by looking up RLP Encoding in Ethereum's Yellow Paper, as is explained here. To directly answer your question for your case:
Signature format is v ++ (length(r) + 0x80 ) ++ r ++ (length(s) + 0x80) ++ s, where + means addition and ++ means concatenation. Notice that length here means the amount of bytes, so that means the amount of symbols in hex divided by two.
In your case, this would lead to
0x28 ++ (0x20 + 0x80) ++ 0xda4429a9e8e6b54cb101b2df002039f2879ab4ca0e8fae64134942cb81f3e581 ++ (0x20 + 0x80) ++ 0x3b90a37dc078a82dfc418695b1d4473661aa4d24dd874ac68678894ff44a6b27
and result in the following signature string:
Notice how I am implicitly assuming your provided v is already in hex format although it does not start with 0x. If this result differs from your expectation, try converting v to its hex representation and following the same process I just described with the converted value.