HarmonyOS鸿蒙Next中有关char的内容

HarmonyOS鸿蒙Next中有关char的内容

以前一直用Android java写,涉及到rc4处理,现在转一部分代码碰到问题了。

比如下面这个是java的,iY是int类型0,然后转化char类型赋值给iCY就是’\u0000’了

char iCY = (char) iY;

那么这段代码ets怎么写呢?

下面是rc4的java全段代码

public static String HloveyRC4(String aInput, String aKey) {
    int[] iS = new int[256];
    byte[] iK = new byte[256];

    for (int i = 0; i < 256; i++)
        iS[i] = i;

    int j = 1;

    for (short i = 0; i < 256; i++) {
        iK[i] = (byte) aKey.charAt((i % aKey.length()));
    }

    j = 0;

    for (int i = 0; i < 255; i++) {
        j = (j + iS[i] + iK[i]) % 256;
        int temp = iS[i];
        iS[i] = iS[j];
        iS[j] = temp;
    }

    int i = 0;
    j = 0;
    char[] iInputChar = aInput.toCharArray();
    char[] iOutputChar = new char[iInputChar.length];
    for (int x = 0; x < iInputChar.length; x++) {
        i = (i + 1) % 256;
        j = (j + iS[i]) % 256;
        int temp = iS[i];
        iS[i] = iS[j];
        iS[j] = temp;
        int t = (iS[i] + (iS[j] % 256)) % 256;
        int iY = iS[t];
        char iCY = (char) iY;
        iOutputChar[x] = (char) (iInputChar[x] ^ iCY);
    }

    return new String(iOutputChar);

}

更多关于HarmonyOS鸿蒙Next中有关char的内容的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

有示例吗?入参是什么,函数返回什么。试着改了一下,不确定行不行。

function hloveyRC4(aInput: string, aKey: string): string {
  const iS: number[] = new Array<number>(256).fill(0);
  const iK: number[] = new Array<number>(256);

  for (let i = 0; i < 256; i++) {
    iS[i] = i;
  }

  let j = 1;

  for (let i = 0; i < 256; i++) {
    iK[i] = aKey.charCodeAt(i % aKey.length);
  }

  j = 0;

  for (let i = 0; i < 255; i++) {
    j = (j + iS[i] + iK[i]) % 256;
    const temp = iS[i];
    iS[i] = iS[j];
    iS[j] = temp;
  }

  let i = 0;
  j = 0;
  const iInputCharCodeArray: number[] = Array.from(aInput, char => char.charCodeAt(0));
  const iOutputCharCodeArray: number[] = new Array<number>(iInputCharCodeArray.length);

  for (let x = 0; x < iInputCharCodeArray.length; x++) {
    i = (i + 1) % 256;
    j = (j + iS[i]) % 256;
    const temp = iS[i];
    iS[i] = iS[j];
    iS[j] = temp;
    const t = (iS[i] + (iS[j] % 256)) % 256;
    const iY = iS[t];
    const iCY = iY as unknown as number;
    iOutputCharCodeArray[x] = iInputCharCodeArray[x] ^ iCY;
  }
 
  return String.fromCharCode(...iOutputCharCodeArray);
}

更多关于HarmonyOS鸿蒙Next中有关char的内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


非常感谢您的回答!

我这边在hexString 转换 Bytes碰到了问题

比如这是java版的方法

```java
/**
 * 16进制字符串转字节数组
 *
 * [@param](/user/param) src 16进制字符串
 * [@return](/user/return) 字节数组
 */
public static byte[] hexString2Bytes(String src) {
    int l = src.length() / 2;
    byte[] ret = new byte[l];
    for (int i = 0; i < l; i++) {
        ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
    }
    return ret;
}

hexString是:7B2538C2BB4D7EC2BA69C2B5C297C3A642C298C2A37A6449776A721101C398C387C2B9C289C28AC38423C28A337CC298C3BC1B这样的

转换byte后是: [123, 37, 56, -62, -69, 77, 126, -62, -70, 105,

然后我用ets的方法代码是以下:

/**
 * 字符串转换字节流
 * [@param](/user/param) hexString 字符串
 * [@returns](/user/returns) 字节流
 */
static hexString2Bytes(hexString: string): Uint8Array {
    let len = hexString.length

    if (len % 2 != 0) {
        hexString = "0" + hexString
    }
    const byteArray = new Array<number>()
    for (let i = 0; i < hexString.length; i += 2) {
        byteArray.push(parseInt(hexString.substring(i, i + 2), 16))
    }
    return new Uint8Array(byteArray)
}

但是转换后的byte是没有负数的,如下: [123, 37, 56, 194, 187, 77, 126, 194, 186, 105,

Button(‘测试’) .width(‘300lpx’) .height(‘300lpx’) .onClick(() => { function toSignedByte(hexString: string): number { const unsignedByte = parseInt(hexString, 16);

  // 模拟Java中8位有符号整数的转换
  const signedByte = ((unsignedByte << 24) >> 24);
  return signedByte;
}
var s = '7B2538C2BB4D7EC2BA69C2B5C297C3A642C298C2A37A6449776A721101C398C387C2B9C289C28AC38423C28A337CC298C3BC1B'
for(var i = 0 ;i<s.length;i=i+2){
  const signedByteValue = toSignedByte(s[i]+''+s[i+1]);
  console.log('signedByteValue', signedByteValue); // signedByteValue -62
}

}) .width(‘100%’) .height(‘100%’)

另一个帖子也是,但是又有后续的问题

上面提到 模拟Java中8位有符号整数的转换

现在要把这个数组转成String,比如java版:

new String(hexString2Bytes(data), "UTF-8")

/**
 * 16进制字符串转字节数组
 *
 * @param src 16进制字符串
 * @return 字节数组
 */
public static byte[] hexString2Bytes(String src) {
    int l = src.length() / 2;
    byte[] ret = new byte[l];
    for (int i = 0; i < l; i++) {
        ret[i] = (byte) Integer
                .valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
    }
    return ret;
}

那么这个new String(XX,“utf-8”)怎么写呢?

ets版我用这个写不行:

/**
 * 字节流转成可理解的字符串
 * @param uint8Array
 * @returns
 */
static uint8ArrayToShowStr1(uint8Array: Uint8Array): string {
    const textDecoder = util.TextDecoder.create("utf-8")
    return textDecoder.decodeWithStream(uint8Array, {
        stream: false
    })
}

类型是Uint8Array,

在HarmonyOS鸿蒙Next中,char类型用于表示单个字符,通常占用1个字节(8位)的存储空间。char类型可以存储ASCII字符集中的字符,也可以用于存储Unicode字符集中的字符。

在鸿蒙Next中,char类型的使用与其他操作系统中的C/C++语言类似,但鸿蒙Next提供了更多的API和框架来支持字符处理。例如,鸿蒙Next提供了Text类来处理字符串,Text类内部使用char数组来存储字符数据。

鸿蒙Next中的char类型可以用于定义字符变量、字符数组以及字符串常量。例如:

char ch = 'A';  // 定义一个字符变量
char str[] = "Hello, HarmonyOS";  // 定义一个字符数组

在鸿蒙Next中,char类型还可以与Text类进行交互。Text类提供了丰富的方法来处理字符串,例如字符串的拼接、查找、替换等操作。例如:

Text text = "Hello, HarmonyOS";
char ch = text.charAt(0);  // 获取字符串的第一个字符

此外,鸿蒙Next还提供了一些与字符处理相关的API,例如Character类,该类提供了判断字符类型、转换字符大小写等方法。例如:

bool isDigit = Character.isDigit('5');  // 判断字符是否为数字
char lowerCh = Character.toLowerCase('A');  // 将字符转换为小写

总之,在HarmonyOS鸿蒙Next中,char类型是处理字符数据的基本类型,开发者可以通过Text类和Character类等API来进行更复杂的字符处理操作。

在HarmonyOS鸿蒙Next中,char是C语言中的基本数据类型,用于存储单个字符,占用1字节内存。开发者可以使用char类型变量处理字符数据,如字符输入输出、字符串操作等。鸿蒙Next支持标准C库函数,如printfscanf等,方便进行字符处理。此外,鸿蒙Next的API也提供了丰富的字符串处理功能,开发者可以结合char类型进行高效开发。

回到顶部