Столбец TBytes набора данных и комбинация полей SQL VarBinary - PullRequest
0 голосов
/ 30 июня 2009

select convert (varbinary (8), 1) в MS SQL Server выдает результат: 0x00000001

При назначении вышеуказанного запроса набору данных в Delphi и доступе к значению поля мы получаем байтовый массив как [1, 0, 0, 0]. Итак, Bytes [0] содержит 1.

Когда я использую IntToHex () для этого байтового массива, это приведет к значению "10000000".

Почему IntToHex рассматривает его в обратном порядке?

Спасибо и всего наилучшего,

Паван.

Ответы [ 3 ]

2 голосов
/ 30 июня 2009

Я думаю, что вы забыли включить ссылку на код, где вы как-то вызываете IntToHex в массиве TBytes. Это ответ на ваш предыдущий вопрос, , как преобразовать байтовый массив в его шестнадцатеричное представление в Delphi .

В моем ответе я забыл объяснить, как указатель на массив байтов будет иметь байты в порядке с прямым порядком байтов, тогда как IntToHex (и все остальное в x86) ожидает их в малой порядок Решение состоит в том, чтобы переключить их. Я использовал эту функцию:

function Swap32(value: Integer): Integer;
asm
  bswap eax
end;

А пока я исправил свой ответ, чтобы объяснить это.

0 голосов
/ 30 июня 2009

Поскольку процессор x86 использует числа с прямым порядком байтов, система нумерации, которая упорядочивает свои байты в обратном порядке. Вам нужно поменять порядок байтов, чтобы получить правильное значение.

0 голосов
/ 30 июня 2009

Это, похоже, проблема little / big endian . Просто переверните байтовый массив или возвращаемое значение из IntToHex. Другим способом было бы сделать это самостоятельно:

myInt = Bytes[0];
Inc(myInt, (Bytes[1] shl 8));
Inc(myInt, (Bytes[2] shl 16));
Inc(myInt, (Bytes[3] shl 24));

Также будьте осторожны со знаком. Является ли значение SQL подписанным или без знака - тип данных Delphi должен соответствовать этому (int / longint подписан, Longword / Cardinal не подписан - см. здесь или в справке Delphi).

...