动中字符串的操作

[内核/驱动] 驱动中字符串的操作

//如果本文有不对的地方,望即时指点!

字符串的初始化

定义一个UNICODE_STRING类型的变量,这只是一个空的结构体而已,我们并没有给它分配任何的内存。如果直接对其进行字符串拷贝等操作,肯定会引起异常的,当我们定义这样类型的一个变量,我们应该就把它看作一个WCHAR型的指针,没有“new”空间,所以我们必须去“new”空间给它。

typedef struct

{

    USHORT Length;

    USHORT MaximumLength;

    PWCHAR Buffer;

}UNICODE_STRING, *PUNICODE_STRING;

有以下几种方式:

1.RtlInitEmptyUnicodeString

UNICODE_STRING str;

WCHAR wcsBuffer[1024] = {0};

RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));

这种方式就像定义一个静态的串 WCHAR wcsBuffer[1024] = {0}。

2.动态申请空间

UNICODE_STRING str;

str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, ‘1234’);

str.Length = 0;

str.MaximumLength = 1024;

这种方式就像定义一个WCHAR* pwcsBuffer = new WCHAR[1024];

使用完之后,必须释放内存。

ExFreePool或者是ExFreePoolWithTag。

3.定义常量UNICODE_STRING

可以使用宏RTL_CONSTANT_STRING

UNICODE_STRING str = RTL_CONSTANT_STRING(L”my first string”);

记住这个字符串不能再被修改,因为这就像定义了char *str = “123”; 该字符串不能再被修改。

字符串的拷贝

RtlCopyUnicodeString(&dst, &src);

字符串的连接

RtlAppendUnicodeToString(&dst, L”123”);

RtlAppendUnicodeToUnicodeString(&dst, &src);

 

//下面的表格是转载的,找不到出处了,见谅!

驱动中使用的字符串操作函数,这里给出ANSI和UNICODE的对比

操作

ANSI串函数

Unicode串函数

Length

Strlen

wcslen

Concatenate

Strcat

strncat

Wcscat

wcsncat

RtlAppendUnicodeStringToString

RtlAppendUnicodeToString

Copy

Strcpy

strncpy

RtlCopyString

Wcscpy

wcsncpy

TrlCopyUnicodeString

Reverse

_strrev

_wcsrev

Compare

Strcmp

Strncmp

_stricmp

_strnicmp

RtlCompareString

RtlEqualString

Wcscmp

Wcsncmp

_wcsicmp

_wcsnicmp

RtlCompareUnicodeString

RtlEqualUnicodeString

RtlPrefixUnicodeString

Initialize

_strset

_strnset

RtlInitAnsiString

RtlInitString

_wcsnset

RtlInitUnicodeString

Search

Strchr

strrchr

strspn

strstr

Wcschr

wcsrchr

wcsspn

wcsstr

Upper/Lowercase

_strlwr

_strupr

RtlUpperString,

_wcslwr

_wcsupr

RtlUpcaseUnicodeString

Character

isdigit

islower

isprint

isspace

isupper

isxdigit

tolower

toupper

RtlUpperChar

Towolower

towupper

RtlUpcaseUnicodeString

Format

Sprintf

vsprintf

_snprintf

_vsnprintf

Swprintf

_snwprintf

String Conversion

Atoi

Atoll

_itoa

_itow

RtlIntegerToUnicodeString

RtlUnicodeStringToInteger

Type conversion

RtlAnsiStringToUnicodeString

RtlAnsiStringToUnicodeString

RtlUnicodeStringToAnsiString

Memory Release

RtlFreeAnsiString

RtlFreeUnicodeString

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java执行字符串,有几种方法可以使用。 一种方法是使用字符串连接符(`+`)。例如,假设你想要态生成一个SQL语句,你可以使用字符串连接符来拼接字符串: ``` String sql = "SELECT * FROM users WHERE name='" + name + "' AND age=" + age; ``` 另一种方法是使用Java的`StringBuilder`类。这个类提供了一个可变的字符串对象,你可以使用`append()`方法来添加字符串: ``` StringBuilder sb = new StringBuilder(); sb.append("SELECT * FROM users WHERE name='").append(name).append("' AND age=").append(age); String sql = sb.toString(); ``` 使用`StringBuilder`类可能比使用字符串连接符快一点,因为它只需要一次内存分配,而不是在每次连接字符串时都分配一次内存。 还有一种方法是使用Java的`String.format()`方法,它可以使用占位符来格式化字符串: ``` String sql = String.format("SELECT * FROM users WHERE name='%s' AND age=%d", name, age); ``` 使用`String.format()`方法可能比其他方法更简洁,但是它可能比其他方法慢一点。 总的来说,选择使用哪种方法取决于你的具体情况。在性能要求较高的情况下,使用`StringBuilder`类可能是最好的选择。在简洁性和可读性更重要的情况下,使用`String.format() ### 回答2: 在Java执行字符串可以使用StringBuffer和StringBuilder这两个类。这两个类都是可变字符串,可以态地添加、修改和删除字符串内容。 StringBuffer是线程安全的,适用于多线程环境下的字符串操作。在处理大量字符串拼接的情况下,可以选择使用StringBuffer,因为它的append方法是同步的,保证了线程安全。例如: ``` StringBuffer sb = new StringBuffer(); sb.append("Hello"); sb.append(" "); sb.append("World"); String result = sb.toString(); System.out.println(result); ``` 输出结果为:Hello World StringBuilder是线程不安全的,适用于单线程环境下的字符串操作。在单线程环境下,使用StringBuilder比StringBuffer效率要高。例如: ``` StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb.append("World"); String result = sb.toString(); System.out.println(result); ``` 输出结果为:Hello World 在字符串的处理过程,可以使用这两个类的append方法来态地拼接字符串,也可以使用delete、insert等方法来删除、插入字符串内容,从而实现字符串操作。同时,这两个类还提供了一些其他的方法,例如reverse、replace等,方便对字符串进行进一步处理。 总之,通过使用StringBuffer和StringBuilder,Java可以很方便地执行字符串操作,满足业务需求。 ### 回答3: 在Java执行字符串,我们可以使用StringBuffer或StringBuilder类。 StringBuffer和StringBuilder类都属于可变字符序列,可以态地修改字符串内容。 首先,我们可以使用StringBuffer类来处理字符串。它提供了许多方法来操作和修改字符串。可以通过append()方法向字符串末尾添加新的字符或字符串,可以通过insert()方法在指定位置插入新的字符或字符串,可以通过delete()方法删除指定位置的字符或字符串,还可以通过replace()方法替换指定位置的字符或字符串等。 另外,我们也可以使用StringBuilder类来操作字符串。StringBuilder类与StringBuffer类类似,提供了相似的方法来修改字符串内容。但与StringBuffer类不同的是,StringBuilder类是非线程安全的,因此在单线程情况下,使用StringBuilder的效率会稍高一些。 下面是使用StringBuffer执行字符串的示例代码: ``` StringBuffer sb = new StringBuffer(); // 创建一个StringBuffer对象 sb.append("Hello"); // 在字符串末尾添加新的字符串 sb.insert(5, " world"); // 在指定位置插入新的字符串 sb.delete(5, sb.length()); // 删除指定位置之后的字符 sb.replace(0, 5, "Hi"); // 替换指定位置的字符 System.out.println(sb.toString()); // 输出修改后的字符串 ``` 通过上述代码,我们可以实现对字符串的执行和修改,并最终输出修改后的结果。 总结起来,利用StringBuffer或StringBuilder类,我们可以在Java高效地执行字符串操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值