【问题标题】:c++ code convert to vb.net calculation errorc++代码转换为vb.net计算错误
【发布时间】:2022-01-16 14:59:49
【问题描述】:

c++ 代码:

char buffer[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
char* data = buffer + 4;
data = (data - buffer + 3) / 4 * 4 + buffer;
int result = data[0];

我把它转换成 vb.net

    Dim buffer() As Byte = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
    Dim data() As Byte = buffer.Skip(4).ToArray()
    Dim len = (buffer.Length - data.Length + 3) \ 4 * 4
    data = buffer.Skip(len).ToArray
    Dim result As Integer = data(0)

计算结果不一致。 在 c++ 结果是 5,vb.net 是 8。我怎样才能正确转换它?

【问题讨论】:

  • 抛开讨厌的指针转换,一点代数告诉你(data - buffer + 3) / 4 * 4 + buffer1 + buffer是一样的,所以最后的result = buffer[1]
  • data - buffer 甚至与buffer.Length - data.Length 不一样。 data - buffer 正在做指针运算,这在 VB 中是做不到的。该操作也不是很有趣,除非有一些干预代码可能会以不同的方式设置数据——您正在计算一个新的缓冲区偏移量,但可以完全在编译时计算。
  • 代码的最终结果是int result = buffer[7]

标签: c++ arrays .net vb.net data-conversion


【解决方案1】:

我不太确定您要实现什么,但是,在 c++ 代码中,您将变量缓冲区初始化为 CHAR 数组,这意味着您会将 1 转换为 char 1,将 2 转换为 char 2 等。 ..如果您使用断点进行调试,您会看到 1 将转换为 '\x1',例如 '\a' 中的 7...然后将数据初始化为指针,它指向第 5 个元素缓冲。然后你做了一些我不太清楚的事情,但它不会改变数据的价值。然后你将 data 的值作为 int 检索,它会是 5。

在 vb.net 中,您不能将字符转换为整数,反之亦然。所以你不能真正转换你的 c++ 代码。

另外,在 vb.net 代码中,将缓冲区初始化为 16 个元素的数组,然后将数据初始化为 12 个元素的数组,从 5 开始(这次不是指针)。然后初始化len,这将是7,因为你有16 - 12 + 3 = 7,然后你将7除以4,得到7。然后你告诉data再次是一个字节数组, 但这次不是跳过缓冲区的前 4 个元素,而是跳过前 7 个 (len) 元素...当然你会得到 8 个结果。

如果可以,请在此处说明您要执行的操作:

char* data = buffer + 4;
data = (data - buffer + 3) / 4 * 4 + buffer;

因为我不是很清楚,并且某些操作在 vb.net 中是不可能的

【讨论】:

    【解决方案2】:

    是双字对齐

     void ReadDwordAlignment() const
    {
        size_t mod = (m_pos & 3);
        if (mod)
            m_pos += 4 - mod;
    }
    

    【讨论】:

      【解决方案3】:
      Private Shared Function ReadDwordAlignment(m_pos As Integer) As Integer
          Dim mods As UInteger = m_pos And 3
          Dim new_pos As Integer = m_pos
          If mods <> 0 Then
              new_pos += 4 - mods
          End If
          Return new_pos - m_pos
      End Function
      

      【讨论】:

      • 更新:Math.Round(((buffer.Length - data.Length + 3) / 4)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2013-08-24
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多