char、sbyte、byte和uint与数组和指针

目录

介绍

背景

使用代码

兴趣点

历史

Nuget画廊


例如,WinAPI+DirectXTerraFX.Interop.Window)和跨平台的XlibTerraFX.Interop.Xlib)或xcbDeafMan1983.Interop.xcb——WIP)任何转换函数都可以使用,轻松编写,类似于浪费长时间使用硬编码函数。

介绍

我想展示一下C#的现代转换函数,如果您使用SDL2DeafMan1983.Interop.SDL2/SDL3DeafMan1983.Interop.SDL3WIP)或GTK4/5和带有Qt6的纯代码(没有 Qt6框架,只有带有WinAPIX11xcb和其他适用于LinuxmacOSAndroid的窗口系统运行时的硬编码源,还有iOS(我不确定))

背景

由于我正在监督NativeAot使用的dotnet应用程序,例如AppWithPluginsPaintNetWIP),并且我有很多关于现代转换函数的工作,例如您在没有固定语句的情况下使用WinAPI没有问题。

使用代码

****
char[]
char*char**char*[]char[][]的解释:

char[] StringToCharArray(string intput)它的工作原理就像string.ToCharArray();

string CharArrayToString(char[] ary)它就像new string(char[] ary);

char* StringToCharPointer(string intput)它是使用TerraFX.Interop.Windows非常特别的指针char*,与C/C++示例中的wchar*或者TChar*不同

string CharPointerToString(char* ptr)是一个反向转换器,不同于 C/C++中的std::stringchar** StringArrayToCharDoublePointer(string[] inputs)

就像在C/C++中的wchar** argvstring[] CharDoublePointerToStringArray(char** dblPtr)一样,就像在C/C++中的wchar** argvchar*[] CharDoublePointerToCharPointerArray(char** dblPtr)一样转换为char*[]char** CharPointerArrayToCharDoublePointer(char*[] ptrAry)

转换为char**char[][] CharPointerArrayToCharDoubleArray(char*[] ptrAry)是一个char[]高级数组长度,可以像在任何C/C++中一样处理所有内容。因为我已经看到了char[][]示例2int main(int argc, char** argv) { ... },如Quake 2Half-Life必须使用char[][]CommandLine或任何功能,但我将寻找更多的功能。

char*[] CharDoubleArrayToCharPointerArray(char[][] dblAry)就像我在char[][] ....int CharPointerLength(char* ptr)中解释的那样,它是char*的新功能。无需担心并发症/问题!它的工作原理类似于char[]

例:

string str_1 = "Hello World!";
char* charPtr_1 = StringToCharPointer(str_1);
Console.WriteLine($"Result: Importing string from char {CharPointerToString(charPtr_1)}");
Console.WriteLine($"Length of char*: {CharPointerLength(charPtr_1)}");

结果:

Result: Importing string from char Hello World!
Length of char*: 12

int CharDoublePointerLength(char** dblPtr)不是正常的长度,只是像char[][]数组长度一样。

请不要忘记string[]char**有问题,因为我试图修复。这似乎是错误的,因为string[]没有正确的数组大小,例如4 =数组的大小,但它需要修复:

[ HELLO ][ HELLO ][ HELLO ]/[ HELLO ] <- It means wrong length

这就是为什么我们需要解决,如果您添加string.Emptynull作为最后一个长度,那么它将能够正常工作。例:

string[] strings = { "Haha ", "Hehe ", "Hihi ", "Hoho ", "Huhu", string.Empty }; // <- Fix if you don't see last item of array.
char** charDblPtr_1 = StringArrayToCharDoublePointer(strings);
for(int i = 0; i < strings.Length - 1; i++) // Need to -1
{
    charDblPtr_1[i] = StringToCharPointer(strings[i]);
    Console.WriteLine($"{strings[i]}");
}
charDblPtr_1[strings.Length - 1] = null; // <- Need fix null

int arrayLength = CharDoublePointerLength(charDblPtr_1);
Console.WriteLine($"Length of char**: {arrayLength} ");

结果:

Haha
Hehe
Hihi
Hoho
Huhu
Length of char**: 5

如果您使用char*[]char**string[]是可以的,请小心!
示例CharPointerArrayToCharDoublePointer()

char*[] charPtrArrays = new char*[]
{
    StringToCharPointer("Bill Gates"), // USA, Ex Microsoft boss
    StringToCharPointer("Jeff Bezos"), // USA Amazon boss
    StringToCharPointer("Tim Cook"), // USA Apple boss
    StringToCharPointer("Thomas Mueller"), // Germany /[ mýler }/, soccer of Bayern Munich
    StringToCharPointer("Nils Petersen"), // Germany, ex soccer of SC Freiburg
    StringToCharPointer("Christian Streich"), // Germany, ex coacher of SC Freiburg
    StringToCharPointer("Juegen Klopp"), // Germany /[ jýken ]/, ex chacher of Liverpool FC
    StringToCharPointer("Olaf Scholz"), // Germany, prime minister of Germany
    StringToCharPointer("Angela Merkel"), // Germany, ex prime minister of Germany
    StringToCharPointer("Jericho Rosales"), // Philippines, player for television
};
char** charDblPtr_2 = CharPointerArrayToCharDoublePointer(charPtrArrays);
for (int i = 0; i < charPtrArrays.Length; i++)
{
    Console.WriteLine($"{i + 1} Name: {CharPointerToString(charDblPtr_2[i])}");
}

int arrayLength_2 = CharDoublePointerLength(charDblPtr_2);
Console.WriteLine("Array Length of char*[] {0} ", arrayLength_2); 

结果:

1 Name: Bill Gates
2 Name: Jeff Bezos
3 Name: Tim Cook
4 Name: Thomas Mueller
5 Name: Nils Petersen
6 Name: Christian Streich
7 Name: Juegen Klopp
8 Name: Olaf Scholz
9 Name: Angela Merkel
10 Name: Jericho Rosales
Array Length of char*[] 10 

以及其他示例CharDoubleArrayToCharPointerArray()

char[][] charArrayArray = new char[][]
{
    new char[] { 'H', 'e', 'l', 'l', 'o' },
    new char[] { 'W', 'o', 'r', 'l', 'd' },
    StringToCharArray("and"),
    StringToCharArray("Mars's World")
};

char*[] chardblArray = CharDoubleArrayToCharPointerArray(charArrayArray);
foreach (var charAry in charArrayArray)
{
    Console.WriteLine($"CharArray: {CharArrayToString(charAry)}");
}

char[][] chardblArray_2 = CharPointerArrayToCharDoubleArray(chardblArray);
for (int i = 0; i < chardblArray_2.Length;i++)
{
    Console.WriteLine($"{i + 1} CharArray: {CharArrayToString(chardblArray_2[i])}");
}

int array_length = CharDoublePointerLength( // <- Length of char double pointer
                        CharPointerArrayToCharDoublePointer( // <- trying char** from char*[]
                            CharDoubleArrayToCharPointerArray(chardblArray_2) // <- trying char*[] from char[][]
                        )
                    );
Console.WriteLine($"Array Length of char[][] is {array_length}"); 

结果:

CharArray: Hello
CharArray: World
CharArray: and
CharArray: Mars's World
1 CharArray: Hello
2 CharArray: World
3 CharArray: and
4 CharArray: Mars's World
Array Length of char[][] is 4 

这就是char[]char*char**char*[]char[][]等等......

如果您对使用TerraFX.Interop.Windows感到兴奋,那么您将享受使用charX/charXXchar*char**长度的新功能,并享受您的开发。
sbyte* <-> stringstring <-> sbyte*

SDL2包装器示例(DeafMan1983.Interop.SDL2):

string转换为sbyte*,并将sbyte*转换为string):

// Example for title in SDL_CreateWindow()
sbyte* title = SBytePointerFromString("HelloSDL");
...
SDL_Window* window = SDL_CreateWindow(title, ... );

sbyte*stringstring来自sbyte*)。

// Example for printf()

[DllImport("c")]
private static extern int printf(sbyte* fmt);
public static int Printf(sbyte* fmt, params object[] args)
{
    string result = StringFromSBytePointer(fmt);
    if (result == null)
        return 1;
    return printf(SBytePointerFromString(string.Format(result, args));
}

sbyte*string的两种很好的方法,你可以像这样使用。

还有Gtk3/Gtk4的好例子:

string[]sbyte**sbyte**来自string[])

static int Main(string[] args)
{
    GtkApplication* app = gtk_application_new(SBytePointerFromString("org.gtk.example"), 
                          GApplicationFlags.G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, ACTIVATE, G_CALLBACK
                    ((delegate* <gtkapplication*, void*, void>)&Activate), null);

    int argc = args.Length;
    sbyte** argv = SByteDoublePointersFromStringArray(args);
    int status = g_application_run(G_APPLICATION(app), argc, argv);

    g_object_unref(app);
    return status;
}

这很棘手,你可以用C/ c++开发,比如用intchar*char*[]

等来开发c#main函数。

sbyte**string[] string[]s来自byte**)

没有可用的代码。您知道它的工作方式就像共享库示例中的参数/参数:Half-Life Sharp(仍在进行中)。

兴趣点

我觉得这很有趣,因为ClangSharpPInvokeGeneratorconst char*char**变成了sbyte*sbyte**因为C/C++ <-> C#不一样,但对于WinAPI非常敏感,因为WinAPI不支持sbyte*/sbyte**,只在C/C++中使用类似的char*/char**

我希望wchat*TChat*与普通chat*不同,因为wchat表示Windows-Charecter并且只有2个字节。

由于它是敏感的,我需要在char*/char**中修复UTF8ANSI格式。

更新:char*到字符串,字符串到char*和释放的char*长度

警告:包将移至“DeafMan198.Utilities”

UtilitiesForUTF16 -> char*stringstringchar*char*char**string[]string[]char**和更多的将在代码中使用中看到)的长度

UtilitiesForSByte-> sbyte*stringstringsbyte*(即将到来的sbyte长度)

UtilitiesForByte-> byte*stringstringbyte*(将到来的byte长度)

我已经用char*UTF16)重新工作了,变成了字符串(UTF8

示例:对于WinAPITerraFX.Interop.Windows

如何在C#下成功使用WinAPI

例:

...
    static string DesktopAppStr = "DesktopApp";
    static string TitleStr = "Windows Desktop Guided Tour Application";

...

        HWND hWnd = CreateWindowEx(
            WS_EX_OVERLAPPEDWINDOW,
            StringToCharPointer(DesktopAppStr),
            StringToCharPointer(TitleStr),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT,
            500, 100,
            HWND.NULL,
            HMENU.NULL,
            hInstance,
            null
        );

... 

这就是WinAPI的全部内容。我很高兴看到中文是否会出现。耶!

如果我发布char*和字符串以及char*的长度的包,请享受您的阅读。

对于byte*<-> string

byte* StringToBytePointer(string input)
string BytePointerToString(byte* ptr)
int BytePointerLength(byte* ptr)
byte** StringArrayToByteDoublePointer(string[] input)
string[] ByteDoublePointerToStringArray(byte** ptrArray)
Int ByteDoublePointerLength(byte** ptrArray)

sbyte** <-> string:

sbyte* StringToSBytePointer(string input)
string SBytePointerToString(sbyte* ptr)
int SBytePointerLength(sbyte* ptr)
sbyte** StringArrayToSByteDoublePointer(string[] input)
string[] SByteDoublePointerToStringArray(sbyte** ptrArray)
Int SByteDoublePointerLength(sbyte** ptrArray)

char* <-> string:

char* StringToCharPointer(string input)
string CharPointerToString(char* ptr)
int CharPointerLength(char* ptr)
char** StringArrayToCharDoublePointer(string[] input)
string[] CharDoublePointerToStringArray(char** ptrArray) 
Int CharDoublePointerLength(char** ptrArray)

历史

我从Ethan Lee SDL2-CS 开始。但是他的SDL2-CS不能使用NativeAot。这就是为什么我在DeafMan1983.Interop.SDL2中重新设计了像C/C++那样的完整指针,因为它对NativeAot支持效果很好。新版本带有char*和更多新功能。它也适用于TerraFX.Interop.Windows

添加遗漏的有关函数的说明。

如果你想花我钱,因为我有很多工作尝试使用string[]char**进行修复,那就是方式。查看信息 

对不起,没有PayPal/Skrill
只有TRXMATICLTC在加密钱包下,因为我必须赚更多的钱。

Nuget画廊

它很快就会到来。(我目前正在工作。对不起,犹豫不决!)

查看Nuget包

dotnet add package DeafMan1983.Utilities

它使用sbyte*<->stringsbyte**<->string[],新的char´*<->string和更多的新...

如果您想查看我的Nuget包,可以访问我的包。

https://www.codeproject.com/Tips/5375957/char-sbyte-byte-and-uint-with-arrays-and-pointers

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值