【问题标题】:The value '-1' cannot be parsed as the type 'Byte'值“-1”无法解析为“字节”类型
【发布时间】:2014-10-03 13:52:09
【问题描述】:

我在一个字符串中有一个字节数组,我试图将它序列化为一个对象,字节数组是在 iPhone 上生成的,但接收服务是 VB.net 我收到错误无法解析值“-1”当进行 serializer.ReadObject 调用并设法让 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

基本输入是

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

【问题讨论】:

  • 你的意思是 iPhone 发送的字符串是一系列数字,对吧?
  • 它发送 myString 的值

标签: .net vb.net


【解决方案1】:

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

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

您可能想改用Int16,尽管我不确定这将如何与您正在使用的序列化/反序列化机制一起工作。

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

【讨论】:

  • SByte 被限制在 -128 到 127 我的第一个字节值是 208 你知道吗?
  • @Noreen Int16(VB 中的缩写)呢?
【解决方案2】:

一个字节(在 VB.Net 或 C# 中)是一个 0 到 255 范围内的 8 位无符号整数。关键在 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

【讨论】:

  • 我无法控制传入的字节数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2021-08-28
  • 2013-12-14
  • 2015-06-10
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多