C# 将有符号字节数组写入流

C# 将有符号字节数组写入流,c#,C#,我想将有符号字节数组sbyte[]写入流。我知道Stream.Write只接受无符号字节[],因此我可以在将其传递到流之前将sbyte[]转换为byte[]。但我确实需要以sbyte[]的形式发送数据。有什么办法吗?我找到了BinaryWriter.Write,但这等同于Stream.Write?您可以利用CLR允许您在字节[]和sbyte[]“免费”之间转换,即使C不: 请注意,首先需要转换为对象,以“说服”C编译器转换为字节[]可能有效。(C语言认为这两种数组类型完全不兼容。) 这样,您就不

我想将有符号字节数组
sbyte[]
写入流。我知道
Stream.Write
只接受无符号字节[],因此我可以在将其传递到流之前将
sbyte[]
转换为
byte[]
。但我确实需要以
sbyte[]
的形式发送数据。有什么办法吗?我找到了
BinaryWriter.Write
,但这等同于
Stream.Write

您可以利用CLR允许您在
字节[]
sbyte[]
“免费”之间转换,即使C不:

请注意,首先需要转换为
对象
,以“说服”C编译器转换为
字节[]
可能有效。(C语言认为这两种数组类型完全不兼容。)

这样,您就不需要创建所有数据的副本-您仍然将相同的引用传递到
流。编写
,只需更改“引用类型”即可。

一些背景:

无符号字节有8位,可以表示0到255之间的值

有符号字节是相同的8位,但解释不同:最左边的位(MSB)被视为“有符号”位,0表示正,1表示负。剩余的7位可以表示0到127之间的值

组合的无符号字节可以表示-128和+127之间的值


如果您通过线路(网络)发送这样一个字节,则由接收器正确解释。

只需将sbyte转换为字节即可。反正是相同的位。为什么不
byte[]e=(byte[])数据
?@DrKoch:因为它不会编译。我加了一段解释,谢谢。但是“等价数据”会被签署吗?@Ivan:我不知道你的意思。它是一个编译时类型为
byte[]
的引用。它的执行时间值是对与
data
相同的数组的引用,以不同的方式表示相同的位。例如,如果您说
equivalentData[0]=255
那么
数据[0]
将是-1…@Ivan:如果你认为有符号字节仅仅是对底层(无符号)字节的一种解释,那么它是有意义的。以同样的方式,4个字节可以解释为整数,或浮点,或其他编码为4个字节的东西;通过对字节中的位进行不同的解释,可以将单个字节解释为有符号字节。你不能发送“有符号字节”,你总是发送(无符号)字节。
sbyte[] data = ...;
byte[] equivalentData = (byte[]) (object) data;
// Then write equivalentData to the stream