raw_memory = bytearray(buf_size)
ctypes_raw_type = (ctypes.c_char * buf_size)
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
python
这段代码翻译成C#对应的代码是什么样子的
C# 中可能就是 Buffer.MemoryCopy()
能给下具体应用吗?谢谢
@tuohaibei: 见 Buffer.MemoryCopy
@dudu: 你好,刚才看了代码了,是直接内存内实现拷贝的,我的代码可能上下文不足,我再补充一下代码:
buf_size = 0x1000
raw_memory = bytearray(buf_size)
ctypes_raw_type = (ctypes.c_char * buf_size)
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
encLen = Objdll.encode(byref(ctypes_raw_memory), buf_size,inputCode,len(inputCode))
print "len:",encLen
print raw_memory[0];
return raw_memory[:encLen]
其中Objdll.encode属于第三方方法,用了ctypes_raw_memory ,不知道用你你说的方法ctypes_raw_memory怎么来生成?
@tuohaibei: 试试 Marshal.Copy ,示例代码:
byte[] buffer = new byte[0x1000];
IntPtr intPtr = Marshal.AllocHGlobal(buffer.Length);
Marshal.Copy(buffer, 0, intPtr, buffer.Length);
Marshal.FreeHGlobal(intPtr);
@dudu: 大牛不愧为大牛,非常感谢。纠结的问题解决了。10分感谢
@dudu: 下午调试还是有问题?传同样的值生成的字节流结果不一样,不清楚是哪里的问题,以下为结果:左边为python生成,右边为c#生成(inputCode传的值是4545454545444343)
@tuohaibei: C#代码具体是怎么写的?
@dudu: byte[] buffer = new byte[0x1000];
IntPtr intPtr Marshal.AllocHGlobal(buffer.Length);
int encLen = encode(intPtr, 0x1000, "4545454545444343", "4545454545444343".Length);
Marshal.Copy(intPtr, buffer, 0, 0x1000)
Console.ReadKey();
}
[DllImport("NEWDLL.dll", EntryPoint = "encode", CharSet = CharSet.Ansi)]
public static extern int encode(IntPtr memory, int buf_size, string inputCode, int strLen);
我读的就是buffer里边的值.和上边python raw_memory[:encLen]里的不一样
@tuohaibei: 将 Marshal.AllocHGlobal(buffer.Length)
改为 Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * buffer.Length);
试试
@dudu: 效果还是一样,我看python代码
“ctypes_raw_type = (ctypes.c_char * buf_size)
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)“
这个地方有一个ctypes.c_char 字符类型的变量,而我们c#代码却没有,是不是与这个有关系?
@tuohaibei: NEWDLL.dll 中 encode() 方法原始方法参数是如何定义的?
@dudu: 这个地方我也不太清楚,这是给我们提供服务的人提供的,我看python代码:
Objdll.encode(byref(ctypes_raw_memory), buf_size,inputCode,len(inputCode)),
是这样定义的byref(ctypes_raw_memory),好像是地址引用,所以我再c#里边用的时候是这样定义的。
[DllImport("NEWDLL.dll", EntryPoint = "encode", CharSet = CharSet.Ansi)]
public static extern int encode(IntPtr memory, int buf_size, string inputCode, int strLen);
第一个参数用的指针类型,刚开始用的memorystream,也可以。我们这边有几个老的调用
[DllImport("NEWDLL.dll", EntryPoint = "decheckcode", CharSet = CharSet.Ansi)]
public static extern int decheckcode(byte[] outputstring, int outBufferSize, byte[] input);
[DllImport("NEWDLL.dll", EntryPoint = "checkcode", CharSet = CharSet.Ansi)]
public static extern int checkcode(byte[] outputstring, int outBufferSize, byte[] input, byte[] o, byte[] p, int q);
[DllImport("NEWDLL.dll", EntryPoint = "gettoken", CharSet = CharSet.Ansi)]
public static extern int gettoken(byte[] outputstring, int outBufferSize, byte[] input);
[DllImport("NEWDLL.dll", EntryPoint = "getHashCode", CharSet = CharSet.Ansi)]
public static extern int getHashCode(byte[] outputstring, int outBufferSize, byte[] input);
但这些是以前的,流程有变,原来的那些方法也用不了了.
关于这个接口我问下给我们提供服务的人.
@tuohaibei: 首先要确认C#中对应的public static extern
定义是否正确
@dudu: 我们之前有对应的代码,帮忙参考一下:
对应的c#代码是
现在python代码是
@dudu: 不清楚转成c#代码应该怎么样?
@tuohaibei: 抱歉,我这边没法进行测试,总之就是这个思路,你可以多尝试一下
@dudu: 方便的话,能帮我调试一下吗?我的QQ是418566447.万分感谢
@tuohaibei: 需要把 NEWDLL.dll 发给我,就在博问中交流
@dudu: 可以,只不过怎么发给你?
@tuohaibei: 可以了,纠结了这么久,原来我一直用了一个没有注册过的newdll