我想执行一个转换,而不诉诸于一些实现相关的技巧。有小费吗?如何将一个4字节的数组转换为一个整数?
回答
你需要知道你的字节的存储方式。
假设(如@ WhiteFang34)bytes
是长度为4的byte[]
,则...
大端:
int x = java.nio.ByteBuffer.wrap(bytes).getInt();
小端:
int x = java.nio.ByteBuffer.wrap(bytes).order(java.nio.ByteOrder.LITTLE_ENDIAN).getInt();
+1这确实有效,并为小端支持提供了一个很好的选择。我想知道Java是否支持这样做。它确实创建了一个对象去通过这条路线。所以效率不高,虽然我怀疑它对于大多数用途很重要。 – WhiteFang34 2011-04-11 02:50:50
假设bytes
是大端顺序出现的整数,通常用于网络的byte[4]
:
int value = ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16)
| ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
的& 0xFF
是必要的,因为byte
是用Java签署,你需要在这里保留签名位。您可以使用此相反的过程:
bytes[0] = (byte) ((value >> 24) & 0xFF);
bytes[1] = (byte) ((value >> 16) & 0xFF);
bytes[2] = (byte) ((value >> 8) & 0xFF);
bytes[3] = (byte) (value & 0xFF);
我可能会误解,但我认为这是你写它的方式。 – 2011-04-11 01:59:35
@大卫:是的。谢谢,我确实是第一次贴错标签。 – WhiteFang34 2011-04-11 02:09:27
为什么从byte []'转换为int时需要第一个&0xff? “<< 24”代表的符号值是不是前导1?据我了解,在这种情况下'((bytes [0]&0xFF)<< 24)'和'((bytes [0] << 24)'是一样的,如果'byte [0]转换为带符号整数,但是<< << 24'除了原始字节的8位之外的所有内容都会丢失 同样,我认为'&0xff'用于丢弃带符号值的值为1的前导位,以便它们不是0或0位从前面的操作来看,是不是说'&0xff'是保留有符号位错误所必需的? – petrn 2017-06-23 20:30:45
你需要指定数组的字节顺序,但假设bytes[0]
是那么最显著字节:
int res = ((bytes[0] & 0xff) << 24) | ((bytes[1] & 0xff) << 16) |
((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
此代码是100%假设您使用反向算法首先创建字节数组。产生于语言,您可以在本机整数类型和字节数组类型之间进行转换
字节顺序问题...然后发现,不同的结构存储在不同的顺序整数的字节。
你不能这样做在Java中投。所以对于Java到Java的通信,这不应该是一个问题。但是,如果您要发送或接收数据包到以C(或C++)语言实现的某个远程应用程序,则需要“知道”网络数据包中使用了哪些字节顺序。对于了解/搞清楚了这一点一些备选策略是:
每个人都使用“网络命令”(大端)用于填充在导线按照上面的例子的代码。 Little-Endian机器上的非Java应用程序需要翻转字节。
发送者找出接收者期望的顺序,并在组装数据时使用该顺序。
接收方找出发送方使用了什么命令(例如通过分组中的一个标记)并相应地解码。
第一种方法是最简单和最广泛使用的,尽管它确实导致不必要的2字节序转换如果同时发送者和接收者是小端。
有没有什么办法通过标准库来做到这一点?我不觉得太好假设事物是字节顺序我正在发送数据包的机器... – Alex 2011-04-11 01:54:32
@Alex:计算机中的字节顺序无关紧要,它是数组的字节顺序,重要的是,您必须指定即使您使用标准库(如果有一个标准的方法来做到这一点...我不记得一个)。 – 2011-04-11 02:01:53
您需要'&0xFF'每个字节,因为'byte'是用Java签名的。有符号位阻碍任何使用任何字节的第一位的数字。例如。尝试从像384这样的整数后退到一个字节数组,当你运行你的代码来获得整数时,你将得到-128而不是384. – WhiteFang34 2011-04-11 02:21:47
不知道这是正确的Java语法,但如何:
int value = 0;
for (i = 0; i <= 3; i++)
value = (value << 8) + (bytes[i] & 0xFF);
你应该'0xff'你的字节[i]',因为'byte'(用Java)可能会引起麻烦,Java会将你的字节转换为负值整数而不是0-255之间的数值 – 2011-04-11 01:58:25
@Yanick:谢谢。你修改我的文章 – 2011-04-11 02:06:41
这是行不通的,它总是返回0.你需要括号来避免操作符优先级:'value =(value << 8)+(bytes [i]&0xFF);' – WhiteFang34 2011-04-11 02:41:07
public static int toInt(byte[] bytes) {
int result = 0;
for (int i=0; i<3; i++) {
result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
}
return result;
}
这不起作用。一个全零的字节数组返回8421504. – WhiteFang34 2011-04-11 02:45:20
这是一个很好的结果! – 2011-04-11 02:59:54
假设你的byte []来自例如某处流可以使用
DataInputStream dis = ... // can wrap a new ByteArrayInputStream(bytes)
int num = dis.readInt(); // assume big-endian.
或
ByteChannel bc = ... // can be a SocketChannel
ByteBuffer bb = ByteBuffer.allocate(64*1024);
bc.read(bb);
bb.flip();
if (bb.remaining()<4) // not enough data
int num = bb.getInt();
当您发送数据时,你应该如果您要发送大端或小端知道。你必须承担其他事情,比如你是否发送一个4字节的有符号整数。二进制协议充满了假设。 (这使得它更紧凑,更快,但比文本更脆弱)
如果你不想做出尽可能多的假设,发送文本。
'int num = dis.readInt(); //假定big-endian.'是非常有用的信息.. – 2016-01-13 20:42:51
我们还可以使用以下,使之更加动态的字节数组的大小
尾端格式:
public static int pareAsBigEndianByteArray(byte[] bytes) {
int factor = bytes.length - 1;
int result = 0;
for (int i = 0; i < bytes.length; i++) {
if (i == 0) {
result |= bytes[i] << (8 * factor--);
} else {
result |= bytes[i] << (8 * factor--);
}
}
return result;
}
的Little Endian格式:
public static int pareAsLittleEndianByteArray(byte[] bytes) {
int result = 0;
for (int i = 0; i < bytes.length; i++) {
if (i == 0) {
result |= bytes[i] << (8 * i);
} else {
result |= bytes[i] << (8 * i);
}
}
return result;
}
这将帮助你很多关于转换字节为int值
- 1. 将一个整数数组转换为一个字符串
- 2. 如何将数组中的最后4个字节转换为整数?
- 3. 将4个字节的字节转换为一个int
- 4. Python:如何从一个4字节的字节数组中获取一个4字节大小的整数?
- 5. 如何将一串数字转换为一个整数列表?
- 6. 如何将一个集合转换为字节数组
- 7. 如何将字节数组转换为两个长整型值?
- 8. 转换一个字符串数组,一个整数数组
- 9. 如何将Python元组(字节数组)的一部分转换为整数
- 10. 如何在Python中将整数视为一个字节数组?
- 11. 如何将一串int整数转换为一个整数数组?
- 12. 在Python中使用struct将4个字节转换为整数
- 13. 如何将一个NSString数组转换为一个c数组的字符串?
- 14. Silverlight 4:如何将bmp字节数组转换为png字节数组?
- 15. 如何将一个整数分解为一个整数数组
- 16. C++如何将数组的最后4个字符转换为整数?
- 17. 将一个整数转换为另一个整数
- 18. 如何将一个字符串数组转换为一个Int数组?
- 19. 如何将一个字符串转换为一个唯一的整数在php
- 20. 如何将python整数转换为CharP-Crypto中ZP组中的一个数字?
- 21. 如何将整数值转换为python中的四个字节数组
- 22. 如何将Java字节数组转换为Scala字节数组?
- 23. 如何将整数转换为字节数组php
- 24. 如何将整数转换为字节数组?
- 25. 如何将24位整数转换为3字节数组?
- 26. C#:转换字节数组转换为一个float
- 27. Java - 将音频的字节数组转换为整数数组
- 28. 转换字节数组为整数
- 29. 将一串数字转换为一个整数,存储结果
- 30. 将整数表示为一个字节
你想转换什么?你的问题不具体。你阵列的四个字节是什么? – bmargulies 2011-04-11 01:53:34