我在一个字符串中有一个字节数组,我正在尝试序列化为一个对象,字节数组是在iPhone上生成的但是接收服务是VB.net我得到错误值'-1'无法解析当进行serializer.ReadObject调用时,作为'Byte'类型并且设法获得c#以使用
将字节数组视为有效byte[] ba = new byte[] { 208, 125, 138, 15, unchecked((byte)-1), 211, 1, 74, 148, unchecked((byte)-9), 82, 10, 245, 193, 115, 64, 108, 12 };
但是未经检查的元素似乎不存在于VB中,我正在解决如何解决问题。
提前致谢
对象是
Public Class GetVehicleListInput : Inherits BaseInput
End Class
BaseInput是
Public Class BaseInput
Private abyteExternalIdentifier As Byte() = Nothing
Public Property ExternalIdentifier() As Byte()
Get
Return abyteExternalIdentifier
End Get
Set(ByVal value As Byte())
abyteExternalIdentifier = value
End Set
End Property
Public Sub New()
End Sub
End Class
我的班级
Dim mystring As String = "{""ExternalIdentifier"":[208,125,138,15,-1,211,1,74,148,-9,82,10,245,193,115,64,108,12]}"
Dim serializer As New Json.DataContractJsonSerializer(GetType(GetVehicleListInput))
Dim thing As GetVehicleListInput
Using stream As MemoryStream = New MemoryStream(Encoding.UTF8.GetBytes(mystring))
thing = DirectCast(serializer.ReadObject(stream), GetVehicleListInput)
End Using
End Sub
答案 0 :(得分:4)
在.NET世界中,Byte
值是无符号的,8位整数。因此它们被限制在0到255之间。
当然,c# 确实允许您禁止溢出检查,但即使如此,您仍然不会将-1值存储为Byte
: 该值为255 。
您可能希望使用Int16
,但我不确定这将如何解决您使用的序列化/反序列化机制。
当然你也可以使用Plutonix的解决方案,但后来我想知道为什么你必须首先传入-1。
答案 1 :(得分:1)
一个字节(在VB.Net或C#中)是一个8位无符号整数,范围为0到255.密钥在C#代码中:
unchecked((byte)-1) ... unchecked((byte)-9)
这会抑制溢出检查,结果数组为:
您的代码应该使用:
mystring = ... "[208,125,138,15,255,211,1,74,148,247,82,10,245,193,115,64,108,12]"
' as byte array:
ba As Byte() = {208, 125, 138, 15, 255, 211, 1, 74, 148, 247,
82, 10, 245, 193, 115, 64, 108, 12}
使用255和247代替负值。
新信息:I don't have control of the incoming byte array
代码看起来像文字,但如果你收到一个字节数组,你就不会有负值。要将传入值转换为字节数组并应用溢出检查:
Dim someVals As Int16() = {208, 125, 138, 15, -1, 211, 1, 74, 148, -9,
82, 10, 245, 193, 115, 64, 108, 12}
Dim byteArry(someVals.Count - 1) As Byte
For n As Integer = 0 To someVals.Count - 1
byteArry(n) = CByte(someVals(n) And 255)
Next