求助:c#与vb.net语法转换

wzuomin 2008-10-08 04:16:51
请问下面的C#语句如何转成正确的vb.net的代码啊?


unsafe int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
{
int x;
int y;
byte* b = (byte*) pBuffer;

for (x = 1; x <= this.videoHeight; x++)
{
y = 0;
while (y < this.videoStride)
{
b[0] = (byte) (b[0] ^ 0xff);
b++;
y++;
}
b = (byte*) pBuffer;
b += x * this.videoStride;
}
return 0;
}


通过工具自动转换后如下:

Private Function DirectShowLib.ISampleGrabberCB.BufferCB(ByVal SampleTime As Double, ByVal pBuffer As IntPtr, ByVal BufferLen As Integer) As Integer Implements ISampleGrabberCB.BufferCB
Dim x As Integer
Dim y As Integer
Dim b As Byte* = DirectCast(pBuffer, Byte*)

x = 1
Do While (x <= Me.videoHeight)
y = 0
Do While (y < Me.videoStride)
b(0) = CByte((b(0) Xor &HFF))
b += 1
y += 1
Loop
b = DirectCast(pBuffer, Byte*)
b = (b + (x * Me.videoStride))
x += 1
Loop
Return 0
End Function


可惜上面这个自动转换后的代码语法根本就不对。
...全文
200 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
stning 2008-10-10
  • 打赏
  • 举报
回复
vb应该能使用指针,刚才百度了一下,是有相关的文章。
http://hi.baidu.com/smofx/blog/item/ef6aa28f8d3ac9fe503d9220.html
wzuomin 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 refeiner 的回复:]
VB不支持不安全代码
[/Quote]

那vb中就没法实现c#那个功能了么?
refeiner 2008-10-10
  • 打赏
  • 举报
回复
VB不支持不安全代码
fengyecsdn 2008-10-10
  • 打赏
  • 举报
回复
真高级 学习一下
wzuomin 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 stning 的回复:]
VB code
unsafe Function ISampleGrabberCB.BufferCB(ByVal SampleTime As Double, ByVal pBuffer As IntPtr, ByVal BufferLen As Integer) As Integer
Dim x As Integer
Dim y As Integer
Dim b As byte* = CType(pBuffer, byte*)

For x = 1 To Me.videoHeight Step x + 1
y = 0
While y < Me.videoStride
b(0) = CType((b(0) ^ 0xff), Byte)
b = b + 1…
[/Quote]

vb中对于 unsafe byte× 就不支持吧?
stning 2008-10-10
  • 打赏
  • 举报
回复
楼主试试这个行不行
stning 2008-10-10
  • 打赏
  • 举报
回复

unsafe Function ISampleGrabberCB.BufferCB(ByVal SampleTime As Double, ByVal pBuffer As IntPtr, ByVal BufferLen As Integer) As Integer
Dim x As Integer
Dim y As Integer
Dim b As byte* = CType(pBuffer, byte*)

For x = 1 To Me.videoHeight Step x + 1
y = 0
While y < Me.videoStride
b(0) = CType((b(0) ^ 0xff), Byte)
b = b + 1
y = y + 1
End While
b = CType(pBuffer, byte*)
b += x * Me.videoStride
Next
Return 0
End Function
wzuomin 2008-10-10
  • 打赏
  • 举报
回复
谢谢ls,呵呵
wzuomin 2008-10-10
  • 打赏
  • 举报
回复
转贴:在VB.Net中使用指针2008年03月12日 星期三 18:04


例1:以下程序我们申请几个指向不同类型的指针:

’使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列
<StructLayout(LayoutKind.Sequential)> _
Public Structure DEFUDT_Test
Public bytb As Byte


Public i32a As Int32
End Structure

Public Function fnGetIntptr1() As IntPtr
’取得一个4字节数组指针
Dim tabytTest(3) As Byte
’以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字节数组的指针

’取得一个指向32位内存数据的指针,
’由于使用gchandle取指针的方法只能对引用的对象有效,
’所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型
Dim ti32Test As Object = Convert.ToInt32(0)
’以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址

Dim tudtTest1 As DEFUDT_Test
’由于结构是一种值类型变量,为保证指针申请方便,我们申请
’取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了
’由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向结构的指针

’在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……

’在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function

上例中指针流程处理可以归纳为:

1、 定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)

2、使用GCHandle.Alloc方法将变量的内存区域固定下来。

3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.

4、对指针进行操作

5、使用GCHandle对象的free方法释放指针指向的内存区域以便net垃圾回收器可以回收这个内存空间

2、指针所指向数据的存取

在.net中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将指针所在地址的数据以XXX类型方式读出。看例程2,我们使用这些方法演示对例1那几个指向不同类型数据的指针作数据存/取操作。

例2:演示向例1申请得到的几个指针执行写入及读取数据的操作.

Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test变量指向的地址写入32位整数77
MsgBox("现在ti32Test的值为:" & ti32Test) ’因为变量存储地址的数据已改为77,所以显示为77
’以下这句之所以可行,因为ti32Test是32位整数,而tpObject指向的tabytTest数组刚好有4个元素
’而每一个byte元素都占用8位,合起来就是32位,和ti32Test占用的空间一样。这就印证了前面提’
’到的net中指针没有指向类型的说明。
Marshal.WriteInt32(tpObject, 0, ti32Test)

’以下代码再将tabytTest字节数组的内容理解为一个int32整数,
’并将值赋值给tudtTest结构中的int32元素

’我们使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在结构中的内存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就临时产生了
’一个指针并指向i32a所在的内存地址(, 这个方法也说明了指针可以以字节为单位进行加减计算以指向合适的变量。
’Marshal.ReadInt32的作用是从指针中读取一个32整数。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’这儿可以将字节数组的内容复制到真正的结构中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)

MsgBox("结构tidtTest1中i32a元素的值为:" & tudtTest1.i32a) ’此处将显示刚赋的值77
wzuomin 2008-10-09
  • 打赏
  • 举报
回复
真的就不能转吗?
wzuomin 2008-10-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zxjay 的回复:]
貌似VB不支持不安全代码
[/Quote]

确信不能使用指针?
topadam02 2008-10-09
  • 打赏
  • 举报
回复
我也不会可以帮你顶!
wzuomin 2008-10-09
  • 打赏
  • 举报
回复
奇了怪了,我发个帖子很少有人问津啊
是我的问题太过简单啦?
都懒的回答?
zxjay 2008-10-08
  • 打赏
  • 举报
回复
貌似VB不支持不安全代码
wzuomin 2008-10-08
  • 打赏
  • 举报
回复
3楼引用我的回复是什么意思?
那个转换也不对。
manica 2008-10-08
  • 打赏
  • 举报
回复
guanzhu
[Quote=引用 2 楼 wzuomin 的回复:]
还有的工具是这么转的

VB.NET code
Private Function BufferCB(SampleTime As Double, pBuffer As IntPtr, BufferLen As Integer) As Integer Implements ISampleGrabberCB.BufferCB
Dim x As Integer
Dim y As Integer
Dim b As Byte* = CByte(pBuffer)

For x = 1 To Me.videoHeight
y = 0
While y < Me.videoStride
b(0) = CByte((b(0) Xor &Hff))

[/Quote]
wzuomin 2008-10-08
  • 打赏
  • 举报
回复
还有的工具是这么转的

Private Function BufferCB(SampleTime As Double, pBuffer As IntPtr, BufferLen As Integer) As Integer Implements ISampleGrabberCB.BufferCB
Dim x As Integer
Dim y As Integer
Dim b As Byte* = CByte(pBuffer)

For x = 1 To Me.videoHeight
y = 0
While y < Me.videoStride
b(0) = CByte((b(0) Xor &Hff))
b += 1
y += 1
End While
b = CByte(pBuffer)
b += x * Me.videoStride
Next
Return 0
End Function


好像也不对啊
wzuomin 2008-10-08
  • 打赏
  • 举报
回复
我在vb.net那儿也发了这个帖子
用到了指针,还真就不会了,问问明白人。
http://topic.csdn.net/u/20081008/16/65194b11-9f57-4319-85c7-f6c9a772306d.html?seed=222345198

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧