So there's a couple of issues here that need to be addressed.
First off, the encoding type of the string is essential to know in advance if you're constrained to a specific byte length. We'll run under the assumption that it's UTF-8, but bear in mind that you may need to adjust for other encoding types.
Secondly, you have an arbitrary string length, so you cannot rely on taking specifically sized chunks of the string (otherwise 250 would be perfect). There's a few ways to skin this, but the easiest is to adapt your loop:
using(StreamReader reader = new StreamReader(@"d:\test.txt"))
{
var stringToChunk = reader.ReadToEnd();
var chunkLength = 512;
for(var i = 0; i < stringToChunk.Length; i += chunkLength)
{
if(i + chunkLength > stringToChunk.Length)
{
chunkLength = stringToChunk.Length - i;
}
var chunk = stringToChunk.Substring(i, chunkLength);
}
}