值' -1'无法解析为类型' Byte'

时间:2014-10-03 13:52:09

标签: .net vb.net

我在一个字符串中有一个字节数组,我正在尝试序列化为一个对象,字节数组是在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

2 个答案:

答案 0 :(得分:4)

在.NET世界中,Byte值是无符号的,8位整数。因此它们被限制在0到255之间。

当然, 确实允许您禁止溢出检查,但即使如此,您仍然不会将-1值存储为Byte该值为255

您可能希望使用Int16,但我不确定这将如何解决您使用的序列化/反序列化机制。

当然你也可以使用Plutonix的解决方案,但后来我想知道为什么你必须首先传入-1。

答案 1 :(得分:1)

一个字节(在VB.Net或C#中)是一个8位无符号整数,范围为0到255.密钥在C#代码中:

unchecked((byte)-1) ... unchecked((byte)-9)

这会抑制溢出检查,结果数组为:

enter image description here

您的代码应该使用:

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