我很困惑,在Objective-C中将字节数组转换为short(反之亦然),并将int转换为字节数组,反之亦然。
我在Java中看到如下
public static short byteArrayToShort(byte[] b) {
if (b.length > 1) {
return (ByteBuffer.wrap(b)).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get();
} else {
return b[0];
}
}
/**
* Short to byte array.
*
* @param value the value
* @return the byte[]
*/
public static byte[] shortToByteArray(short value) {
return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(value).array();
}
/**
* Int to byte array.
*
* @param value the value
* @return the byte[]
*/
public static byte[] intToByteArray(int value) {
return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(value).array();
}
/**
* Convert the byte array to an short starting from the given offset.
*
* @param b The byte array
* @return The integer
*/
public static int byteArrayToInt(byte[] b) {
if (b.length > 1) {
return (ByteBuffer.wrap(b)).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().get();
} else {
return b[0];
}
}
在Objective-C中,我尝试过如下操作:
//Byte to Short array
- (uint16_t*) byte2short:(uint8_t *)bytes size:(int)size{
uint16_t*shorts = (uint16_t*)malloc(size/2);
for (int i=0; i < size/2; i++){
shorts[i] = (bytes[i*2+1] << 8) | bytes[i*2];
}
return shorts;
}
//Short to Byte array
- (uint8_t *) short2byte:(uint16_t*)shorts size:(int)size{
uint8_t *bytes = (uint8_t *)malloc(size*2);
for (int i = 0; i < size; i++)
{
bytes[i * 2] = (uint16_t) (shorts[i] & 0x00FF);
bytes[(i * 2) + 1] = (uint16_t) (shorts[i] >> 8);
shorts[i] = 0;
}
return bytes;
}
我尝试过这样做,而且我也不知道在Objective-c中将int转换为Byte数组。
请建议我
答案 0 :(得分:0)
您的代码的问题在于您假设malloc
以某种方式“知道”有关正在分配的内容的大小,就像Java的数组new
知道分配5之间的区别一样int
和5 short
s。好吧,malloc
没有。除非你另有说明,否则它会分配所需的字节数。这就是你这样做的原因
uint16_t*shorts = (uint16_t*)malloc(size/2);
然后将size/2
uint16_t
写入其中,超出缓冲区。
在C中(以及在Objective-C中,它是C的超集)分配基元数组的正确方法如下:
size_t count = (size+1)/2; // Do not assume that size is even
uint16_t *shorts = malloc(sizeof(uint16_t)*count);
现在你有足够的记忆力来适应你所有的短裤。
在您的其他功能中,您应该使用
uint8_t *bytes = malloc(sizeof(uint8_t)*size*2);
请注意,在两种情况下都不需要演员表。但bytes
变量的类型很重要,因为这决定了在bytes[i * 2]
和bytes[(i * 2)+1]
表达式中写入的实际地址:
for (int i = 0; i < size; i++)
{
bytes[i * 2] = (uint8_t) (shorts[i] & 0xFF);
bytes[(i * 2) + 1] = (uint8_t) (shorts[i] >> 8);
shorts[i] = 0;
}