How do you hash data for mining? I was examining the block hashing algorithm and I tried to hash some blocks with my c++ sha256 to check results. 

The hashes were wrong all the time so I thought I couldn't build the block header properly but then I took the data from wiki https://en.bitcoin.it/wiki/Block_hashing_algorithm and concatenated the values from the example and the result is still wrong (I tried it also in online sha-256 calculator so the function is ok). 

Of course I must be missing something like coding but if I understand it right, sha is a function where you give a message and it takes the ascii codes of the message and does the math operations on these codes. But how can I pass a block header as a string? Or do I have to find an implementation of sha that interpretes the input differently? 

I'm sorry, I know it's a noob question but this doesn't seem so obvious to me.

Edit: 

The code is quite complex, but what I have at this moment is basically a made up block header that I packed in a string and for the example from the wiki page I mentioned above the string looks like

0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2
fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695

I also have a sha function that takes a string as an input so the hash should be

1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000

but it's 

cf5397ae292d5d37a0df81aa7f89f9fc7e1c43329e441ce2294f0a72e542c7d9

I also checked it on http://www.xorbin.com/tools/sha256-hash-calculator so I think the code is ok but I must just be missing something here.
sha is a function where you give a message and it takes the ascii
  codes of the message and does the math operations on these codes.


Wrong. sha256 is a hash function. This means it takes data of (fairly, there can be a granularity) arbitrary length and returns data of constant length. In the case of sha256, the granularity is 1 bit (though the granularity of most implementations of it is 1 Byte; Thank you, dave_thompson_085) and the data it returns is always 256 bit = 32 Byte. No ASCII encoding required.

You feed your hash function the wrong data. You feed it a string containing the ASCII-encoded hexadecimal representation of the data you're supposed to feed into the function.

If you have a hexadecimal representation encoded in ASCII, you first have to convert it to the data it represents and then feed that into the hash function.