SQL Server VARBINARY (max) в c # byte [] - PullRequest
       1

SQL Server VARBINARY (max) в c # byte []

2 голосов
/ 04 февраля 2011

Я запрашиваю таблицу (один из столбцов - VARBINARY(MAX)), который возвращает некоторые записи.

Затем я сохраняю это как .dat.csv, затем анализирую этот файл .dat и получаюvarbinary значение в строку, разделив файл на основе запятых.Теперь мне нужно преобразовать этот varbinary в байтовый массив.Как я могу это сделать?

1 Ответ

5 голосов
/ 04 февраля 2011

Хороший вопрос. Технически, вы можете сделать это, сначала преобразовав массив символов, а затем преобразовав его в байты. Однако строки в .NET по умолчанию кодируются в Юникоде (а не в ASCII), поэтому это сложно.

Если это вообще возможно, вы должны попытаться извлечь varbinary из файла в виде байтового массива, используя FileStream, из которого вы читаете, вместо StreamReader, который выполняет преобразования кодирования в и из типа кодировки файла.

Проблема этого межбайтового пристрелки заключается в том, что определенные байт-коды имеют особое значение в каждой кодировке Unicode, предоставляя декодеру информацию о количестве байтов, которые он должен извлечь для декодирования следующего символа. При преобразовании между различными кодировками Unicode и кодировкой строк в .NET UTF-8 для строк будут получены, потеряны и изменены байты. Когда это струна, нет ничего важного; информация о кодировке остается со строкой. Когда это двоичные данные, кодирование и декодирование могут искажать их, если это не сделано очень специфическим способом.

Единственный способ, которым это будет работать безупречно, - это если вы записываете файл, используя кодировку ASCII, а затем считываете его обратно таким образом, что каждый отдельный байт будет обрабатываться как один символ. Затем вы можете просто преобразовать каждый символ обратно в байт, и более значимый байт UInt16 за кулисами Syetem.Char, который является нулевым заполнением для байта, поданного в этот символ, будет отброшен.

var reader = new StreamReader(new FileStream("test.csv"), Encoding.ASCII);
var varBinaryString = reader.Read(<wherever the varbinary is in the file/line>);

var byteArray = varBinaryString.ToCharArray().Select(c=>(byte)c).ToArray();

Технически, вы можете использовать его в любой кодировке Unicode, но вам нужно знать много подробностей о том, как вы записали эти байты и как читатель читает их обратно, чтобы вы могли выполнить правильные действия. кодирование и расширение (или дефляция) по мере необходимости для получения исходного потока байтов.

РЕДАКТИРОВАТЬ: Версия .NET 2.0 - нет Linq:

StreamReader reader = new StreamReader(new FileStream("test.csv"), Encoding.ASCII);
string varBinaryString = reader.Read(<wherever the varbinary is in the file/line>);

char[] charArray = varBinaryString.ToCharArray();
byte[] byteArray = new byte[charArray.Length];

for(int i=0; i< charArray.length; i++)
{
    byteArray[i] = (byte)charArray[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...