Как преобразовать строку байтов base64 в Float32 или Float64? - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь преобразовать файлы VTK (vtu) в формате XML из двоичных строк base64 в строки ASCII. Файлы выглядят примерно так:

<Points>
    <DataArray type="Float32" NumberOfComponents="3" format="binary">
`gJQGAGp7+sJTMbPCVWiWv4RP+8LbKrTCj0yDv1kC+8J5w7PCUe0xv34YAMNqprTCtsRDv7yw/8IgdLTCUE0lv/8 (etc...)
    </DataArray>
</Points>

Вы также можете иметь эти файлы в формате ASCII, поэтому в ASCII то же самое выглядит так:

<Points>
    <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="ascii" RangeMin="9.6120050431" RangeMax="280.36424584">
      -125.24104309 -89.596336365 -1.1750589609 -125.65530396 -90.083702087 -1.0257738829
      -125.50458527 -89.881782532 -0.69502741098 -128.09567261 -90.325027466 -0.7647203207
      -127.84518433 -90.226806641 -0.64571094513 -128.24607849 -90.475311279 -0.61999017
      (etc...)
    </DataArray>
</Points>

Мне нужно, чтобы мой код работал, когда файлы поступают в ASCII или двоичном формате, поэтому мне нужно иметь возможность преобразовать строку base64 в первом случае в формат ASCII во втором случае.

Прямо сейчас у меня есть:

string pointString = nodeList[0].ChildNodes.Item(0).InnerText.Trim();
if(format.Equals("binary", StringComparison.InvariantCultureIgnoreCase))
{
    byte[] bytes = Convert.FromBase64String(pointString);
    pointString = Encoding.ASCII.GetString(bytes);
}

аа, и моя строка выходит совсем неправильно:

pointString:? $

Я чувствую, что здесь что-то упущено. Куда я иду не так?

1 Ответ

2 голосов
/ 08 июня 2019

Попробуйте преобразовать байты непосредственно в числа с плавающей запятой и проверьте, дает ли он правильный результат:

byte[] bytes = Convert.FromBase64String(pointString);
float[] dataArray = Enumerable.Range(0, bytes.length / 4).Select(i => BitConverter.ToSingle(bytes, i * 4)).ToArray();
...