Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-字符串中的字节数组_Java_Arrays_Byte_Hex - Fatal编程技术网

Java-字符串中的字节数组

Java-字符串中的字节数组,java,arrays,byte,hex,Java,Arrays,Byte,Hex,可能重复: 例如,我有一个字符串“DEADBEEF”。如何将其转换为byte[]bytes={0xDE,0xAD,0xBE,0xEF}?getBytes()将获取平台编码中字符的字节。但是,听起来您希望将包含十六进制字节表示形式的字符串转换为实际表示的字节数组 在这种情况下,我会向您指出这个现有的问题:(注:我个人更喜欢第二个答案使用commons编解码器,但更多是出于哲学原因)循环每对两个字符,并分别转换每对: byte[] bytes = new byte[str.length()/2];

可能重复:

例如,我有一个字符串“DEADBEEF”。如何将其转换为byte[]bytes={0xDE,0xAD,0xBE,0xEF}?

getBytes()将获取平台编码中字符的字节。但是,听起来您希望将包含十六进制字节表示形式的字符串转换为实际表示的字节数组


在这种情况下,我会向您指出这个现有的问题:(注:我个人更喜欢第二个答案使用commons编解码器,但更多是出于哲学原因)

循环每对两个字符,并分别转换每对:

byte[] bytes = new byte[str.length()/2];

for( int i = 0; i < str.length(); i+=2 )
    bytes[i/2] = ((byte)Character.digit(str.charAt(i),16))<<4)+(byte)Character.digit(str.charAt(i),16);
byte[]bytes=新字节[str.length()/2];
对于(int i=0;ibytes[i/2]=((byte)Character.digit(str.charAt(i),16))您可以将字符串解析为long,然后提取字节:

String s = "DEADBEEF";
long n = Long.decode( "0x" + s );  //note the use of auto(un)boxing here, for Java 1.4 or below, use Long.decode( "0x" + s ).longValue();
byte[] b = new byte[4];
b[0] = (byte)(n >> 24);
b[1] = (byte)(n >> 16);
b[2] = (byte)(n >> 8);
b[3] = (byte)n;

tskuzzy的答案可能是正确的(没有测试),但如果可以,我建议使用Apache。它有一个满足您需要的
Hex
类。

看看人们为什么不使用API[您是要将字符串转换为十六进制还是ASCII字节?“DEADBEEF”的ASCII字节不是
{0xDE,0xAD,0xBE,0xEF}
。他没有说ASCII——为什么每个人都认为他想要ASCII?这就是你在阅读后3秒钟内回答问题所得到的。@alexcoco——鉴于没有人知道这个人在问什么,而且OP还没有澄清,尼克对每个人说dv是非常苛刻的。+1是的——有人知道这个问题!为什么latt呃更有用吗?第一个是标准的十六进制编码。我很难找到一个适合你“更好”解释的问题。@musiKk:后者被称为“ASCII编码”,而不是“十六进制解码”@tskuzzy:-1.此代码专门用于输入-它仅适用于十六进制数字
A
F
,而不适用于正常的
0
9
(也以十六进制数出现)。最好使用
字符。数字(c,16)
而不是
c-'A'+10
。(请在修复此问题后发表评论,我将撤消我的否决票。)@Musik:哦,没关系,你是对的。我考虑的更多是以这种方式转换任意字符串(例如“QWERTY”)(这显然毫无意义)。这种方法在这种情况下有效,但通常仅适用于16个十六进制数字(即8个解码字节)以下的字符串long.@Paulo这是真的,但是如果需要,您可以将字符串分成16个字符的批。