最近项目中使用需要上位机和下位机通过rs232通信,涉及到通讯加密问题,

硬件那边主要是pcb layout的,于是我就把加密的活拦了过来,锻炼锻炼

首先说明问题:

在c中,加密解密都测试通过,然后在c#中调用后,发现解密字符串对不上

c代码如下:

	//扩展DES加密,明文可以为任意长度
char* Encrypt(const char *str, const char password[8], int lenOfStr); ///扩展DES解密,密文长度必须为的倍数
char* Decrypt(const char *str, const char password[8], int lenOfStr);

c#代码如下:

        [DllImport("DesDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string Encrypt(string bytes_data, string bytes_password, int length); [DllImport("DesDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string Decrypt(string bytes_data, string bytes_password, int length);

排除问题:在函数中添加弹出框来查看结果,发现在c中用messagebox弹出来的和我得到的返回值一摸一样,这样就排除了参数传递错误的异常,

应该是在编码格式上出了问题

查阅资料,得知 c 中的 char* 是ascii编码的,而我们c#使用的字符串,默认是unicode的,这就导致了字符乱码

既然是编码格式问题,那我们就从格式入手,在dllimport中指定参数传递的格式

c#代码如下:

        [DllImport("DesDLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern string Encrypt(string bytes_data, string bytes_password, int length); [DllImport("DesDLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern string Decrypt(string bytes_data, string bytes_password, int length);

ok,问题完美解决

c# 通过 p/invoke 使用 c的加密程序 参数传递问题的更多相关文章

  1. linux c最简单的加密程序

    最初的密码程序是在Hirst First c里面看到的,大概内容如下:对待加密的字符串的每一个字符和某个数值进行一次按位异或得到密文,再进行一次按位异或得到明文. 补充知识:按位异或的结果是“同位得1 ...

  2. Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

    因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这 ...

  3. 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)

    留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...

  4. windows端加密程序,lua代码,ZeroBrane调试

    发一个自己改的zerobrane版本(启动中文,快捷键改成和一样:F5启动调试,F9断点,F10逐过程,F11逐语句,F12跳出函数) 在zerobrane 1.0(2015.3.13)发布的基础上改 ...

  5. DES/des3 加密程序

    1 #ifndef POLARSSL_DES_H #define POLARSSL_DES_H #define DES_ENCRYPT 1 #define DES_DECRYPT 0 #define ...

  6. [转].net reactor 学习系列(五)---源代码加密程序

    .NET Reactor使用教程(加密源代码示例) 1.打开 Eziriz .NET Reactor,主界面如图1所示: 图1 2.单击 Main Assembly 右边的 Open,选择要加密的软件 ...

  7. 【Java】Swing+IO流实现一个简单的文件加密程序(较完整版)

    留着参考 beans package com.my.bean; import java.io.Serializable; public class EncryptedFile implements S ...

  8. 制作URL以GET方式提交的简单加密程序

    首先我们用到的是 DESCryptoServiceProvider 类 对此微软给出的解释是 定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象.无法继承此类. 接下 ...

  9. linux 下password加密程序(能够用于替换shadow文件里的用户password)

    源代码例如以下: #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ if(arg ...

随机推荐

  1. go中sync.Once源码解读

    sync.Once 前言 sync.Once的作用 实现原理 总结 sync.Once 前言 本次的代码是基于go version go1.13.15 darwin/amd64 sync.Once的作 ...

  2. AtCoder Beginner Contest 186

    A Brick int n, m; int main() { scanf("%d%d", &n, &m); printf("%d\n", n / ...

  3. C语言入门-ide的概念介绍及codeblocks编辑器安装汉化

    大家好,本章教程就ide(集成开发环境)来说一说. ide就是编译器+编辑器,原理就是在编辑器写代码,然后编辑器会让编译器来编译成二进制可执行文件. 常见的c/c++编译器有mingw64,msvc, ...

  4. Python之内存泄漏和内存溢出

    预习知识:python之MRO和垃圾回收机制 一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题.对于一个用 python 实现的,长期运行的后台 ...

  5. Linux tar 使用笔记

    常用语法 打包和压缩包 仅打包不压缩:tar -cvf usr.tar /usr 将 /usr 目录打包为 usr.tar 打包并以 gz 格式压缩:tar -czvf usr.tar.gz /usr ...

  6. 【LeetCode】2020-03 每日一题

    121. 买卖股票的最佳时机(简单) [分类]:模拟.思维 [题解]:可以用O(n)的复杂度完成,只需要在遍历的时候记录到当前位置为止买入股票的最小价格minn,再维护一个当前卖出股票价(a-minn ...

  7. WM_CLOSE WM_QUIT WM_DESTROY 三者的区别

    一 个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,向用户提出是否真的退出.你知道让用户作确认或 有错误出现或有什么应该注意的事情发生的时候,往往弹 ...

  8. c++ 反汇编 数组和指针

    字符串初始化字符数组 58: char as[] = "hello word"; 00AC7308 A1 70 2E B6 00 mov eax,dword ptr [string ...

  9. MIT 6.824拾遗(一)聊聊basic-paxos

    前言 The Paxos algorithm, when presented in plain English, is very simple. ------ Lamport,<Paxos Ma ...

  10. Dynamics CRM 在表单上显示更改历史记录(审核历史记录)

    前言 虽然Dynamics CRM自带的审计很好,但是对于缺乏使用CRM经验的用户来说,自带的UCI界面实在是太隐藏了: 于是乎就出现了需求:想通过在表单上直接看到看审计历史记录: 在网上搜索了很多中 ...