Функции Visual FoxPro (VFP) CTOBIN и BINTOC - эквивалент в .Net - PullRequest
1 голос
/ 16 февраля 2012

Мы переписываем некоторые приложения, ранее разработанные в Visual FoxPro, и перерабатываем их с использованием .Net (с использованием C #)

Вот наш сценарий: Наше приложение использует смарт-карты. Мы читаем данные с смарт-карты, которая имеет имя и номер. Имя возвращается хорошо читаемым текстом, но число, в данном случае «900» возвращается как 2-байтовое символьное представление (131 и 132) и выглядит так - * „

Эти 2 специальных символа можно увидеть в расширенной таблице Ascii ... теперь, как вы можете видеть, 2 байта равны 131 и 132 и могут варьироваться, поскольку не существует единой стандартной расширенной таблицы ascii (насколько я могу судить, читая некоторые из постов здесь)

Итак ... смарт-карта была ранее записана для использования функции BINTOC в VFP, и поэтому 900 была записана на карту как ƒ „. А в foxpro эти 2 специальных символа могут быть преобразованы обратно в целочисленный формат с помощью функции CTOBIN ... еще одна встроенная функция в FoxPro ..

Итак (наконец-то, дошли до сути) - до сих пор мы не смогли преобразовать эти 2 специальных символа обратно в int (900), и нам интересно, возможно ли в .NET прочитать символьное представление целого числа? назад к фактическому целому числу.

Или есть способ переписать логику этих двух функций VFP в C #?

UPDATE : После некоторой путаницы мы понимаем, что для получения 900 в 2 байта нам нужно преобразовать 900 в 16-битное двоичное значение, а затем нам нужно преобразовать это 16-битное двоичное значение в десятичное значение.

Таким образом, как и выше, мы получаем обратно 131 и 132 и их соответствующие двоичные значения как 10000011 (десятичное значение 131) и 10000100 (десятичное значение 132). Когда мы объединяем эти 2 значения в «1000001110000100», это дает десятичное значение 33668, однако, если мы удалили ведущий 1 и преобразовали «000001110000100» в десятичное, это дает правильное значение 900 ...

Не слишком уверен, почему это так ...

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 07 ноября 2012

Похоже, что VFP хранит ваше значение в виде 16-разрядного (короткого) целого числа со знаком. Кажется, у меня есть странная точка переключения для отрицательных чисел, но он добавляет 128–8-разрядные числа и добавляет 32768–16-разрядных чисел.

Таким образом, преобразование 16-разрядных чисел из строки должно быть таким же простым, как чтение 16-разрядного целого числа, а затем удаление из него 32768. Если вам нужно сделать это вручную, то первое число нужно умножить на 256, а затем добавить второе число, чтобы получить сохраненное значение. Затем возьмите 32768 от этого числа, чтобы получить ваше значение.

Примеры:

131 * 256 = 33536
33536 + 132 = 33668
33668 - 32768 = 900

Вы можете попробовать использовать преобразования C # в соответствии с http://msdn.microsoft.com/en-us/library/ms131059.aspx и http://msdn.microsoft.com/en-us/library/tw38dw27.aspx, чтобы выполнить хотя бы часть работы за вас, но если нет, то это не должно быть слишком сложно для написания кода выше вручную. .

...