在字节数组前加一个字节

3

我需要在字节数组的开头添加字符串“00”或字节0x00。我尝试用for循环来实现,但当我将其转换为十六进制时,它不会显示在最前面。


1
如果它实际上是byte [],您可以使用Arrays.copy(...)将1-(n + 1)插槽填充为原始数组,然后用0x00填充插槽0。 - Thomas
1个回答

6

当转换为字节时,字符串“00”与数字0x00是不同的。你试图将什么数据类型附加到你的字节数组中?假设它是字符串“00”的字节表示形式,请尝试以下方法:

bytes[] orig = <your byte array>;  
String prepend = "00";  
bytes[] prependBytes = prepend.getBytes();  
bytes[] output = new Bytes[prependBytes.length + orig.length];

for(i=0;i<prependBytes.length;i++){
    output[i] = prependBytes[i];
}

for(i=prependBytes.length;i<(orig.length+prepend.lenth);i++){
  output[i] = orig[i];
}

您可以使用Arrays.copy(...)而不是之前提到的两个for循环来执行预处理。请参见如何组合两个字节数组
或者,如果您要在字节数组中文字面上添加0,则可以按以下方式声明prependBytes并使用相同的算法。
byte[] prependBytes = new byte[]{0,0};

您提到正在将字节数组转换为十六进制,这可能会截断前导零。为了测试这一点,请尝试在以下内容前面添加并转换为十六进制,看看是否有不同的输出:

byte[] prependBytes = new byte[]{1,1};

如果你想去掉前导零,你可以将十六进制数转换为字符串并进行格式化。

这并不是添加了00,而是在所有散列字节的开头添加了“0303”。它还覆盖了哈希的前四个字符。我还使用BigInteger将其从字节转换为字符串,方法是使用new BigInteger(bytearray).toString(16)。 - italiano40
这是因为0303很可能是字符串“00”的字节表示。我想我知道你想做什么...稍后我会编辑我的答案并分享我的想法。 - Tucker
1
@italiano40:“这会在所有哈希字节的开头添加“0303”。不,它不会这样做,它会添加0x3030到开头,这是“00”的字节表示,这正是您所要求的。如果您真正想要的是0x0 0x0,请相应地调整代码。” - user207421
我认为你的例子中有一个错误。output[i] = orig[i]; 不应该是 output[i] = orig[i-prependBytes.length]; 吗?这样才不会超出索引范围。 - OscarVanL
错别字:byte[] orig = <your byte array>; byte[] prependBytes = new byte[]{0,0}; byte[] output = new byte[prependBytes.length + orig.length];for(int i=0;i<prependBytes.length;i++){ output[i] = prependBytes[i]; }for(int i=prependBytes.length;i<(prependBytes.length+orig.length);i++){ output[i] = orig[i-prependBytes.length]; } - djp3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接