MemoryStream в sbyte[]

Я все еще пытаюсь добавить изображение человека в формате jpeg в Open LDAP, используя библиотеки С# Novell:

Openldap: добавьте jpegPhoto в inetOrgPerson

Существует конструктор для Novell.Directory.Ldap.LdapAttribute со следующей подписью:

public LdapAttribute(string attrName, sbyte[] attrBytes)

Так что планирую использовать этот. Но как преобразовать jpeg-изображение из MemoreyStream в sbyte[]?

MemoryStream.ToArray() 

метод возвращает byte[] и я не знаю, как это сделать.


person Oscar    schedule 30.05.2014    source источник


Ответы (2)


Вы можете преобразовать массив следующим образом:

Array.ConvertAll(bytes, b => (sbyte)b)
person SLaks    schedule 30.05.2014
comment
Гораздо лучше, чем моя MemoryStream.ToArray().Select(a=>(sbyte)a).ToArray() идея, которую я собирался опубликовать. - person Scott Chamberlain; 30.05.2014
comment
Спасибо за Ваш ответ. Но в исходном массиве есть значения больше 127. Что будет? Вызовет ошибки? Преобразование не сделает изображение нечитаемым? - person Oscar; 30.05.2014
comment
@Oscar: они будут рассматриваться как отрицательные числа; базовые байты не изменятся. Это должно быть сделано в контексте unchecked. - person SLaks; 30.05.2014
comment
На самом деле C# byte не подписан - msdn. microsoft.com/en-us/library/ms228360%28v=vs.90%29.aspx - person David Crowell; 30.05.2014
comment
@DavidCrowell: именно поэтому он спрашивает об этом. - person SLaks; 30.05.2014

В среде CLR вы можете постоянно преобразовывать byte[] в sbyte[]. Посмотрите мой предыдущий ответ об этом малоизвестном приеме.

(sbyte[])(object)MemoryStream.ToArray(); //compiles and runs
person usr    schedule 30.05.2014